обрабатывать переработанный флажок внутри ListView с ResourceCursorAdapter - PullRequest
0 голосов
/ 24 февраля 2012

Я загружаю контактные данные телефона в ListView, который имеет TextView и CheckBox в виде строки.

проблема, с которой я сталкиваюсь, заключается в обработке CheckBox, когда я проверяю любой элемент в ListView, это проверяется, но когда я прокручиваю вниз элементы listView, получаю проверку automatically для нового набора строк, это происходит только потому, что listview переработал материал, но как я могу обработать это для флажка

Я использую ResourceCursorAdapter и использую методы bindView и newView.

Я видел несколько потоков, в которых они сказали, чтобы сохранить состояние флажка, но они not for ResourceCursorAdapter, так как будет подход?

до сих пор я пытался следовать based on RateListDemo of commonsware

 public View getView (final int position, View convertView, ViewGroup parent) {

    View row = super.getView(position, convertView, parent);
    ContactListItemCache holder=(ContactListItemCache)row.getTag();

    if (holder==null) { 
    holder=new ContactListItemCache(row);
    row.setTag(holder);

    /** I really don't know what to set over here **/
    CheckBox cbox=(CheckBox)row.findViewById(R.id.contactCheck);
        cbox.setOnClickListener( new OnClickListener(){
            @Override
            public void onClick(View v) {


                Log.d("Check check",position+"");

            }

        });

        /** I really don't know what to set over here too **/
        holder.selCheckBox =cbox;
        holder.selCheckBox.setTag(new Integer(position));

    }
return row;

}

Вот мой ContactListItemCache

  final static class ContactListItemCache {
    public TextView nameView;
    public QuickContactBadge photoView;
    public CheckBox selCheckBox;
    public CharArrayBuffer nameBuffer = new CharArrayBuffer(128);
    public CharArrayBuffer nameMiddleBuffer = new CharArrayBuffer(128);
    public CharArrayBuffer nameFamilyBuffer = new CharArrayBuffer(128);

    /** Following Changes I have Made **/
    ContactListItemCache(){}
    ContactListItemCache(View base){

        selCheckBox = (CheckBox)base.findViewById(R.id.contactCheck);
       }
}

Ответы [ 2 ]

1 голос
/ 09 марта 2012

У меня была похожая проблема, и я нашел обходной путь, хотя я не уверен, что это лучший способ сделать это.

Я следовал этой (довольно хорошей) серии уроков http://www.vogella.de/articles/AndroidListView/article.html#overview_listview и реализовано до и включая раздел 8. «Учебник. Модель домена и взаимодействие строк» ​​

Обратите внимание, что здесь не используется ResourceCursorAdapter.

Оттуда я изменил getModel ()функция и сам класс Model.Я изменил метод getModel (), чтобы он возвращал список моделей, которые соответствуют данным из моей базы данных.Вот пример кода (большинство скопировано из учебника с примерами модификаций).Ищите комментарии «// пример дополнительных данных».Здесь показаны места, которые были изменены для обработки большего количества данных (например, если вы хотите, чтобы элементы списка отображали не только CheckBox и TextView).

public class Model {

    private String name;
    private int exampleInt; // example of additional data
    private boolean selected;

    public Model(String name) {
        this.name = name;
        this.exampleInt= 0;
        selected = false;
    }

    public Model(String name, int exampleInt) {
        this.name = name;
        this.exampleInt= exampleInt;
        selected = false;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // example of additional data
    public int getExampleInt() {
        return exampleInt;
    }

    public void setExampleInt(int i) {
        this.exampleInt = i;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }

}

Затем в своей деятельности измените getModel () функция для заполнения списка информацией из вашей базы данных.Я притворяюсь, что данные примера (exampleInt) содержатся в столбце «exampleint»:

private List<Model> getModel() {
    //setContentView(R.layout.teamview);
    datasource.open();
    Cursor cursor = datasource.GetCursor();

    List<Model> list = new ArrayList<Model>();

    while ( cursor.moveToNext() ) {
        list.add( get( cursor.getString( cursor.getColumnIndex( "name" ) ),
                cursor.getInt(cursor.getColumnIndex("exampleint" ) ) ) );  // example of additional data
    }

    // Initially select one of the items
    //list.get(1).setSelected(true);
    datasource.close();
    return list;
}

Вам также придется изменить функцию get (), которая возвращает новый экземпляр Model, если вы хотитедополнительный примерInt:

private Model get(String name, int example) {
    return new Model(name, example);
}

Наконец, в вашем адаптере массива (в учебнике это InteractiveArrayAdapter) измените ViewHolder, чтобы он соответствовал макету вашего элемента списка.В этом примере я представлю, что он называется youritemlayoutxml и имеет дополнительный TextView (R.id.exampleint) для отображения нашего нового exampleInt.Также измените функцию getView (...), чтобы настроить представление с необходимой информацией:

static class ViewHolder {
    protected TextView textName;
    protected TextView textExampleInt; // example of additional data
    protected CheckBox checkbox;
}


public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(R.layout.youritemlayoutxml, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.textName = (TextView) view.findViewById(R.id.name);
        viewHolder.textExampleInt= (TextView) view.findViewById(R.id.exampleint);  // example of additional data
        viewHolder.checkbox = (CheckBox) view.findViewById(R.id.checkbox1);
        viewHolder.checkbox
                .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                        Model element = (Model) viewHolder.checkbox
                                .getTag();
                        element.setSelected(buttonView.isChecked());

                    }
                });
        view.setTag(viewHolder);
        viewHolder.checkbox.setTag(list.get(position));
    } else {
        view = convertView;
        ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.textName.setText(list.get(position).getName());
    holder.textExampleInt.setText(Integer.toString(list.get(position).getExampleInt()));  // example of additional data
    holder.checkbox.setChecked(list.get(position).isSelected());
    return view;
}

Я считаю, что все остальное должно быть изменено из учебника.

0 голосов
/ 25 февраля 2012

commonsWare имеет хороший пример для обработки этого:

RateListDemo

Надеюсь, это поможет.

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