我有一个包含649个条目的ListView。列表中的每个视图都有两个LinearLayouts,一个ImageView,一些TextView和一个CheckBox。我目前有代码通过所有CheckBoxes并计算它们,以及更多的代码来确定哪些被检查,所以我可以使用它们。但是,每当我检查其中一个CheckBox时,它上面和下面的每七个CheckBox都会被神奇地检查。计算复选框的方法返回我实际检查的数字,但是获取所有复选框的索引的方法只返回第一个x检查,无论我是检查它们还是远离它们的7。例如,如果我检查数字21,则该方法返回索引3.我已经包含了一些相关的代码段: 列表中每个View的布局代码:
<?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;
}
如果我可以添加任何额外信息,请询问!
答案 0 :(得分:1)
嗯,我认为你误解了getChildCount()
和getChildAt()
方法的作用。那些实际上只会获得渲染的视图。除非我在这里误读了一些东西,否则如果你有650行,你就无法通过正在渲染的视图来完成你想要的东西。相反,您应该实现onItemClickListener
(或者,在单击复选框时触发的内容),并在选中复选框后,将该状态保存到模型中。
答案 1 :(得分: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()上做了什么我取消选中所有复选框并再次手动检查我需要根据它对应的textview检查的那些。因此,如果用户在选中第一个复选框后向下滚动,则视图中的所有复选框都将取消选中,如果他再次向上滚动,则所有复选框都将被取消选中,但之后单击的复选框将再次重新检查。