Проблема с checkBox - PullRequest
       1

Проблема с checkBox

1 голос
/ 27 июля 2011

У меня странная проблема с моим флажком.В моем адаптере у меня есть TextView, ImageView и CheckBox.Я должен был реализовать кнопку для выбора всех / отменить все, и все работает отлично.Проблема в том, что когда я выбираю один флажок, если я прокручиваю список, есть и другие флажки (расстояние между ними равно 10), и я не понимаю почему.Кто-нибудь может мне помочь?

Вот мой адаптер:

public class LazyAdapter extends BaseAdapter {

        private Activity activity;
        private String[] data;
        private String[] nume;
        private LayoutInflater inflater = null;
        public ImageLoader imageLoader;

        public LazyAdapter(Activity a, String[] d, String[] f) {
            activity = a;
            data = d;
            nume = f;
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            imageLoader = new ImageLoader(activity.getApplicationContext(),"Folder2");
        }

        public int getCount() {
            return data.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public class ViewHolder {
            public TextView text;
            public ImageView image;
            public CheckBox ck;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            View vi = convertView;
            ViewHolder holder;
            if (convertView == null) {
                vi = inflater.inflate(R.layout.item, null);
                holder = new ViewHolder();
                holder.text = (TextView) vi.findViewById(R.id.text);
                holder.image = (ImageView) vi.findViewById(R.id.image);
                holder.ck = (CheckBox) vi.findViewById(R.id.chkbox);
                if (flag)
                    holder.ck.setChecked(true);
                else
                    holder.ck.setChecked(false);

                vi.setTag(holder);
            } else
                holder = (ViewHolder) vi.getTag();

            holder.text.setText(nume[position]);
            holder.image.setTag(data[position]);
            imageLoader.DisplayImage(data[position], activity, holder.image);
            return vi;
        }

    }

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Просмотры в списке переработаны. Ваш список данных может иметь 100 строк, но ListView имеет только 10 (эти видимые) строки. При прокрутке строки перерабатываются. Последняя строка в ListView переходит в первую позицию или в другую сторону. Вы должны изменить состояние этих строк. Вы должны сохранить состояние флажка в массиве, а не в представлениях.

Добавить

        final List<Boolean> isCheckedList;

инициализировать его в конструкторе:

        isCheckedList = new ArrayList<Boolean>();
        for(int i=0;i<myDataLength;i++){
            isCheckedList.add(Boolean.FALSE);
        }

и измените getView:

        holder.ck.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                isCheckedList.set(position, holder.ck.isChecked());
            }
        });

в месте, где вы заполняете строки:

        holder.ck.setChecked(isCheckedList.get(position));

Чтобы изменить состояние всех флажков, используйте:

        Collections.fill(isCheckedList, Boolean.FALSE);
        notifyDataSetChanged();
1 голос
/ 27 июля 2011

Вам необходимо переместить этот код:

    if (flag)
         holder.ck.setChecked(true);
    else
         holder.ck.setChecked(false);

из вашего блока if{}.

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