Почему мой собственный ListAdapter не работает? - PullRequest
1 голос
/ 02 ноября 2011

проблема, с которой я сталкиваюсь, - это когда я нажимаю на чекбокс и делаю прокрутку списка вверх, чтобы изменить выбранный флажок, или иногда, если выбрать первый флажок, чтобы последний флажок тоже был выбран. Я знаю, что мой английский еще недостаточно хорош, извините за это. Любая помощь приветствуется.

import java.util.ArrayList;
import java.util.Hashtable;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;

public class MyListAdapter extends BaseAdapter{

     public static class ViewHolder {

         public CheckBox chkb = null;

    } 


    private LayoutInflater mInflater;

    private ArrayList<MyListAdapterItem> myListAdapterItems = null;

    private Hashtable<Object, Object> items = null;

    private boolean selectAll = false;

    private boolean readOnly = false;

    public MyListAdapter(Context context, ArrayList<MyListAdapterItem> myListAdapterItems, boolean selectAll, boolean readOnly) {

        mInflater = LayoutInflater.from(context);

        this.myListAdapterItems = myListAdapterItems;

        this.selectAll = selectAll;

        this.readOnly = readOnly;

        items = new Hashtable<Object, Object>();
    }

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

        ViewHolder viewHolder = null;

        if (convertView == null) {

            convertView = mInflater.inflate(R.layout.chkb_fila, null);

            viewHolder = new ViewHolder();

            viewHolder.chkb = (CheckBox) convertView.findViewById(R.id.chkbCultivo);

            convertView.setTag(viewHolder);

        }else {

            viewHolder = (ViewHolder) convertView.getTag();

        }

        items.put(myListAdapterItems.get(position), viewHolder.chkb);

        viewHolder.chkb.setText(myListAdapterItems.get(position).getDescription());

        if(selectAll){

            viewHolder.chkb.setChecked(true);
        }

        if(readOnly){

            viewHolder.chkb.setEnabled(false);

        }

        return convertView;

    }


    public int getCount() {

        return myListAdapterItems.size();

    }


    public Object getItem(int position) {

        return myListAdapterItems.get(position);

    }


    public long getItemId(int position) {

        return position;

    }

    /**
     * @return the myListItems
     */
    public ArrayList<MyListAdapterItem> getMySelectedListItems() {

        ArrayList<MyListAdapterItem> listSelectedItems = new ArrayList<MyListAdapterItem>();

        CheckBox tmpCheckBox = null;

        for(int i=0; i<items.size(); i++){

            tmpCheckBox = (CheckBox) items.get(myListAdapterItems.get(i));

            if(tmpCheckBox.isChecked()){

                listSelectedItems.add(myListAdapterItems.get(i));

            }

        }

        return listSelectedItems;

    }

}

Ответы [ 3 ]

0 голосов
/ 02 ноября 2011

Вот несколько ссылок, которые вы ищете.Продвинутый, но если вы останетесь с этим и не откажетесь от этого, вы выучите тонну !!!Взгляните:

Android: элементы ListView с несколькими нажимаемыми кнопками

Пользовательский элемент списка Android с вложенными виджетами

Рейтинги и кнопки в списке элементов

0 голосов
/ 02 ноября 2011

2 варианта.

1) Не изменяйте свой вид.Всегда раздувать новый.Это «лениво», но если в вашем приложении слишком мало записей, вероятность появления ошибки будет ниже.

2) Убедитесь, что вы установили все в каждом представлении.Вы используете их повторно, поэтому, если вы ранее что-то установили, оно останется таким.

Измените это:

if(selectAll){

        viewHolder.chkb.setChecked(true);
    }

    if(readOnly){

        viewHolder.chkb.setEnabled(false);

    }

на

        viewHolder.chkb.setChecked(selectAll);
        viewHolder.chkb.setEnabled(!readOnly);

С блоками if вы не устанавливаете другую сторону логического значения (вы также можете использовать блоки else, но это более многословно).

0 голосов
/ 02 ноября 2011

Проблема в том, что метод getView повторно использует представления, поэтому вы должны обязательно обновить состояния флажков внутри этого метода; это также подразумевает, что вы должны где-то сохранить это состояние.

...