Каждый седьмой блок отмечен флажками в ListView

1

У меня есть ListView, который имеет 649 записей. Каждый вид в списке имеет два LinearLayouts, ImageView, несколько TextViews и CheckBox. В настоящее время у меня есть код для проверки всех CheckBoxes и подсчета их, а также кода для определения, какие из них проверены, поэтому я могу их использовать. Тем не менее, всякий раз, когда я проверяю один из CheckBox, каждый седьмой CheckBox над ним и под ним волшебным образом также проверяется. Метод подсчета отмеченных ящиков возвращает число, которое я действительно проверил, но метод для получения индексов всех отмеченных ящиков возвращает только первый проверенный х, независимо от того, проверил ли я их или те, которые у них есть. Например, если я проверяю номер 21, метод возвращает индекс 3. Я включил некоторые из соответствующих сегментов кода: Код макета для каждого вида в списке:

<?xml version="1.0" encoding="utf-8"?>

  

<TextView
    android:id="@+id/id"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:textSize="20sp"/>

<LinearLayout
    android:layout_width="180dp"
    android:layout_height="50dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/name"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:textColor="#777777"
        android:id="@+id/type"/>

</LinearLayout>
<CheckBox
    android:layout_gravity="right|center_horizontal"
    android:id="@+id/check"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:focusableInTouchMode="false"/>

Проверить метод подсчета:

    public int[] whichAreChecked()  //TODO: this should work.
{
    int listItemCount = ChooserList.getChildCount();
    ArrayList<Integer> ints=new ArrayList<Integer>();
    for(int i=0; i<listItemCount; i++)
    {
        CheckBox cbox = (CheckBox) ((View)ChooserList.getChildAt(i)).findViewById(R.id.check);
        if(cbox.isChecked())
            ints.add(i);
    }
    Log.e("durr", ""+ints.size());
    int[] result=new int[ints.size()];
    for(int i=0; i<result.length; i++)
        result[i]=ints.get(i);
    return result;
}

Проверить метод подсчета:

    public int countChecks()
{
    int checked=0;
    int listItemCount = ChooserList.getChildCount();
    for(int i=0; i<listItemCount; i++)
    {
        CheckBox cbox = (CheckBox) ((View)ChooserList.getChildAt(i)).findViewById(R.id.check);
        if(cbox.isChecked())
            checked++;
    }
    Log.e("countChecks()", ""+checked);
    return checked;
}

Если я могу добавить дополнительную информацию, пожалуйста, спросите!

Теги:
checkbox
listview

2 ответа

1
Лучший ответ

Хмммм, я думаю, вы неправильно поняли, что делают методы getChildCount() и getChildAt(). Фактически они получат только визуализированные представления. Если я не что-то неправильно понял, если у вас есть 650ish строк, вы не можете выполнить то, что хотите, с видами, которые визуализируются. Вместо этого вы должны реализовать onItemClickListener (или, наоборот, что-то, что срабатывает при щелчке по флажкам), и после того, как флажок установлен, сохраните это состояние в своей модели.

  • 0
    Спасибо за ответ! Я добавил onCheckChangedListener для каждого CheckBox в пользовательском адаптере и добавил его индекс к статическому ArrayList <Integer> в Activity, и обновил методы для чтения из него соответственно. Тем не менее, каждый седьмой блок по-прежнему проверяется всякий раз, когда я проверяю только один, что является причиной всей этой проблемы.
  • 0
    Ах, это исправлено! Мой адаптер не всегда создавал новый вид, когда он должен был быть. 'Это все исправлено! Спасибо!
Показать ещё 2 комментария
1

Я тоже столкнулся с аналогичным королем проблемы, поэтому после многого чтения я решил эту проблему следующим образом:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.listview, null);
            holder = new ViewHolder();
            holder.nameView = (TextView)convertView.findViewById(R.id.textView1);
            holder.numberView = (TextView)convertView.findViewById(R.id.textView2);
            holder.cb = (CheckBox)convertView.findViewById(R.id.checkBox1);
            convertView.setTag(holder);                
        } else {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.nameView.setText(mData.get(position).toString());
        holder.numberView.setText(mNumber.get(position).toString());
        holder.cb.setChecked(false);
        holder.cb.setTag(position);



        if(selected.indexOf(mNumber.get(position).toString()) >= 0)
        {

        holder.cb.setChecked(true);
        }

        return convertView;
    }

}

Вот что я делаю, что на getView() Я снимаю все флажки и проверяю вручную вручную те, которые мне нужно проверить в соответствии с текстовым отображением, которое ему соответствует. Поэтому, если пользователь прокручивается вниз после проверки первого флажка, все флажки в представлении будут сняты, и если он снова прокрутится вверх, тогда все флажки будут сняты, но затем тот, который он нажал, снова будет перепроверен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню