Проблемы с поиском позиции в адаптере для ListView - PullRequest
2 голосов
/ 06 марта 2012

У меня серьезные проблемы с getView в ListView.Проблема в том, что у меня есть CheckBoxes на каждом ряду.Мне нужно работать с ними - ListView является частью TabHost, и мне нужно запомнить, какой CheckBox был проверен, и использовать его на других вкладках.

Однако у меня также есть «главный флажок», который проверяет всеФлажки в списке.Ничего страшного, но дело в том, что я просто не могу узнать, где я щелкнул, чтобы изменить состояние CheckBox в ArrayList, где я храню все состояния CheckBox.Каждый раз, когда я назначаю слушателя каждому представлению, «int position» в качестве аргумента дает какой-то странный номер, определенно не тот, который мне нужен - позиция в адаптере, держу пари, что-то вроде «позиция на экране прямо сейчас ...»

Вот код:

public View getView(int position, View convertView, ViewGroup parent) {
        count = position;
        View rowView = convertView;
        SingleCarView sView = null;

        if (rowView == null) {
            LayoutInflater inflater = activity.getLayoutInflater();
            rowView = inflater.inflate(R.layout.activity_overview_listview_row, null);
            sView = new SingleCarView();

            sView.cbx = (CheckBox)rowView.findViewById(R.id.overview_listview_chckbox);
            sView.carName = (TextView)rowView.findViewById(R.id.overview_listview_label);
            sView.state = (ImageView)rowView.findViewById(R.id.overview_listview_icon);
            rowView.setTag(sView);
        } else {
            sView = (SingleCarView) rowView.getTag();
        }
        // THE TROUBLE BEGINS HERE...
        sView.cbx.setChecked(savedState.get(position));
        sView.cbx.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(computerActionWithCheckBox) {
                    // nothing
                } else {
                    if(allCars.isChecked()) {
                        savedState.set(count, isChecked);
                        userModifiedCheckBox = true;
                        allCars.setChecked(false);

                        adapter.notifyDataSetChanged();
                    } else {
                        savedState.set(count, isChecked);
                    }
                }
            }
        });
        sView.carName.setText(objects.get(position));
        switch(DataLoaderBeta.par.carState.get(position)){
        case 1:
            sView.state.setImageResource(R.drawable.ic_moving);
            break;
        case 2:
            sView.state.setImageResource(R.drawable.ic_out_of_signal);
            break;
        case 0:
            sView.state.setImageResource(R.drawable.ic_parked);
            break;
        }
        return rowView;
    }

Большое спасибо за любой ответ!: -)

1 Ответ

4 голосов
/ 06 марта 2012

В методе getView() установите в качестве тега для CheckBox и целое число, представляющее позицию, которую вы получите из метода getView():

sView.cbx.setTag(new Integer(position));

Затем в вашем OnCheckedChangeListener вы получаете установленный флажок, параметр buttonView, и из этой кнопки получаете тег getTag() и используете это число для позиции в savedState:

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          Integer realPosition = (Integer) buttonView.getTag(); //realPosition will be the real position you get in the getView() method
//other stuff here
...