У меня есть 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;
}
Если я могу добавить дополнительную информацию, пожалуйста, спросите!
Хмммм, я думаю, вы неправильно поняли, что делают методы getChildCount()
и getChildAt()
. Фактически они получат только визуализированные представления. Если я не что-то неправильно понял, если у вас есть 650ish строк, вы не можете выполнить то, что хотите, с видами, которые визуализируются. Вместо этого вы должны реализовать onItemClickListener
(или, наоборот, что-то, что срабатывает при щелчке по флажкам), и после того, как флажок установлен, сохраните это состояние в своей модели.
Я тоже столкнулся с аналогичным королем проблемы, поэтому после многого чтения я решил эту проблему следующим образом:
@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() Я снимаю все флажки и проверяю вручную вручную те, которые мне нужно проверить в соответствии с текстовым отображением, которое ему соответствует. Поэтому, если пользователь прокручивается вниз после проверки первого флажка, все флажки в представлении будут сняты, и если он снова прокрутится вверх, тогда все флажки будут сняты, но затем тот, который он нажал, снова будет перепроверен.
onCheckChangedListener
для каждого CheckBox в пользовательском адаптере и добавил его индекс к статическому ArrayList <Integer> в Activity, и обновил методы для чтения из него соответственно. Тем не менее, каждый седьмой блок по-прежнему проверяется всякий раз, когда я проверяю только один, что является причиной всей этой проблемы.