Как флажок узнает его связь с просмотром текста - PullRequest
0 голосов
/ 09 декабря 2011

Я кодирую контрольный список на Android, следуя примеру из учебника.ListActivity состоит из списка (R.layout.PCheckList), где у каждой строки есть флажок, а текстовое представление заблокировано внутри горизонтального макета (R.layout.lchecklist).Есть строка кода, которую я совершенно не понимаю. Код приведен ниже, и я выделил строку

public class PChecklist extends ListActivity {

    TextView selection;
    String[] tasks={"Do Laundry",
            "Wash Dishes",
            "Make the bed",
            "Study",
            "Buy Groceries",
            "Mow the lawn",
            "Shave",
            "Iron Clothes",
            "Breathe periodically"};

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.pchecklist);

        this.selection = (TextView) findViewById(R.id.selection2);


        ArrayList<DailyTask> dailyTaskListModel = new ArrayList<DailyTask>();
        for(String t:tasks)
        {
            dailyTaskListModel.add(new DailyTask(t));
        }

        this.setListAdapter(new CheckListAdapter(this,dailyTaskListModel));
    }

    private DailyTask getTaskAt(int position)
    {
        return ((CheckListAdapter)getListAdapter()).getItem(position);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        this.selection.setText(String.format("Selection: %s", getTaskAt(position).toString()));
    }

    class DailyTask
    {
        String task;
        boolean isCompleted = false;

        DailyTask(String task)
        {
            this.task = task;
        }

        public String toString()
        {
            if(this.isCompleted)
                return (task.toUpperCase());
            else return (task);
        }
    }

    class CheckListAdapter extends ArrayAdapter<DailyTask>
    {
        Activity activity;

        CheckListAdapter(Activity context,ArrayList<DailyTask> taskList)
        {
            super(context, R.layout.lchecklist,taskList);

            this.activity = context;
        }


        public View getView(int position, View convertView, ViewGroup parent) {
            View recycledView = convertView;
            CheckListViewAccessor checkListViewAccessor=null;
            CheckBox checkbox;

            if(recycledView==null)
            {
                //if there is no view, we have to make one by inflating a layout.
                LayoutInflater inflater = activity.getLayoutInflater();
                recycledView = inflater.inflate(R.layout.lchecklist, null,false);

                checkListViewAccessor = new CheckListViewAccessor(recycledView);
                recycledView.setTag(recycledView);
                checkbox = checkListViewAccessor.getCheckBox();

                CompoundButton.OnCheckedChangeListener checkStateChangedListener = new CompoundButton.OnCheckedChangeListener(){

                    public void onCheckedChanged(CompoundButton cb, boolean isChecked) {
                        //When the check button is pressed, we want two things to happen.
                        //1. Update the model.
                            //for some reason we have to do this.
                            int positionOfCheckedItem = (Integer) cb.getTag();

                            DailyTask task = getTaskAt(positionOfCheckedItem);
                            task.isCompleted = isChecked;

                        //2. Change the String in the row to upper case.
                            cb.setText(task.toString());
                    }
                };

                checkbox.setOnCheckedChangeListener(checkStateChangedListener);

            }else//if recycledView is not null, then we don't need to add a listener, we just need to get access to the UI components
            {
                checkListViewAccessor = (CheckListViewAccessor) recycledView.getTag();
                checkbox = checkListViewAccessor.getCheckBox();
            }

            DailyTask task = getTaskAt(position);
            checkbox.setTag(new Integer(position));
            **checkbox.setText(task.toString());
                    //^This line I don't get.**
            checkbox.setChecked(task.isCompleted);


            return (recycledView);
        }

    }

    class CheckListViewAccessor
    {
        View checkListView;
        CheckBox checkbox=null;

        CheckListViewAccessor(View checkListView)
        {
            this.checkListView = checkListView;
        }

        CheckBox getCheckBox()
        {
            if(checkbox==null)
                this.checkbox = (CheckBox) findViewById(R.id.checkbox);
            return (checkbox);
        }
    }
}

В указанной строке как флажок узнает, какой текст TextView изменить?Когда были установлены эти отношения?

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Нет связанного TextView с CheckBox. Потому что CheckBox это TextView. Взгляните на иерархию здесь :

ava.lang.Object
   ↳    android.view.View
       ↳    android.widget.TextView
           ↳    android.widget.Button
               ↳    android.widget.CompoundButton
                   ↳    android.widget.CheckBox

Другими словами CheckBox - это TextView с дополнительным управлением состоянием для checked и unchecked. (На самом деле CompoundButton отвечает за управление государством, но это детали).

0 голосов
/ 09 декабря 2011

Связь устанавливается адаптером. Для каждого элемента списка объект «флажок» соответствует флажку фактического элемента списка. Это означает, что очень легко изменить Представления элементов списка, и в дополнение очень сложно изменить другой элемент из определенного элемента в getView().

Вы можете думать об этом так; в адаптере - для каждого getView() - текущий элемент будет рассматриваться как "локальные переменные" с вашей точки зрения. Вы не должны беспокоиться обо всех глобальных элементах в настоящее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...