我有什么:用Textviews和复选框的自定义列表视图。
问题:如果我检查屏幕上显示的初始项目,然后查找列表,当我返回列表顶部(向上滚动)时,它们的值将被正确保存。但是,如果我滚动列表,例如我想检查我的列表中的最后一棵树复选框,然后如果我上下滚动,他们变得没有检查....为什么?????? **
我见过各种解决方案在其他论坛同样的问题,也在这里在stackoverflow,但问题仍然存在。
下面我getView功能,我认为是好的:当滚动我的自定义列表查看框丢失检查值
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_select_friends, null);
viewHolder=new ViewHolder();
viewHolder.nameText=(TextView) convertView.findViewById(R.id.personName);
viewHolder.surnameText=(TextView) convertView.findViewById(R.id.personSurname);
viewHolder.contactImage=(ImageView) convertView.findViewById(R.id.personImage);
viewHolder.checkBox=(CheckBox)convertView.findViewById(R.id.checkBox);
convertView.setTag(viewHolder);
viewHolder.nameText.setTag(viewHolder.nameText);
viewHolder.nameText.setTag(viewHolder.surnameText);
viewHolder.contactImage.setTag(data[position]);
viewHolder.checkBox.setChecked(data[position].isCheck());
viewHolder.checkBox.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
if(viewHolder.checkBox.isChecked()==true)
data[position].setCheck(true);
else
data[position].setCheck(false);
}
});
}
else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.nameText.setText(data[position].getName());
viewHolder.surnameText.setText(data[position].getSurname());
viewHolder.contactImage.setImageResource(data[position].getPhotoRes());
viewHolder.contactImage.setScaleType(ScaleType.FIT_XY);
viewHolder.checkBox.setChecked(data[position].isCheck());
return convertView;
}
请帮我......两天,我解决不了这个问题:( 感谢您的答案:)
。 解决:我解决我的getView的问题丝毫验证码:
public class NewQAAdapterSelectFriends extends BaseAdapter {
private LayoutInflater mInflater;
private Person[] data;
boolean[] checkBoxState;
ViewHolder viewHolder;
public NewQAAdapterSelectFriends(Context context) {
mInflater = LayoutInflater.from(context);
}
public void setData(Person[] data) {
this.data = data;
checkBoxState=new boolean[data.length];
}
@Override
public int getCount() {
return data.length;
}
@Override
public Object getItem(int item) {
return data[item];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_select_friends, null);
viewHolder=new ViewHolder();
viewHolder.nameText=(TextView) convertView.findViewById(R.id.personName);
viewHolder.surnameText=(TextView) convertView.findViewById(R.id.personSurname);
viewHolder.contactImage=(ImageView) convertView.findViewById(R.id.personImage);
viewHolder.checkBox=(CheckBox)convertView.findViewById(R.id.checkBox);
convertView.setTag(viewHolder);
}
else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.nameText.setText(data[position].getName());
viewHolder.surnameText.setText(data[position].getSurname());
viewHolder.contactImage.setImageResource(data[position].getPhotoRes());
viewHolder.contactImage.setScaleType(ScaleType.FIT_XY);
viewHolder.checkBox.setChecked(checkBoxState[position]);
viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(((CheckBox)v).isChecked()){
checkBoxState[position]=true;
data[position].setCheck(true);
}else{
checkBoxState[position]=false;
data[position].setCheck(false);
}
}
});
return convertView;
}
static class ViewHolder {
TextView nameText;
TextView surnameText;
ImageView contactImage;
CheckBox checkBox;
}
}
我已经看到这个教程做我的getView:http://androidcocktail.blogspot.it/2012/04/adding-checkboxes-to-custom-listview-in.html
嗨,感谢的答案。我改变了我的代码,如你所建议的,但现在当我点击一个复选框,我有一个NullPointerException行数据[viewHolder.position] .setCheck(viewHolder.checkBox.isChecked());为什么??? – 2012-07-05 21:33:11
使用你的调试器或logcat语句来确认'viewHolder'不是null,有'position',有CheckBox和data [viewHolder.position]也是有效的。但我认为我看到我疯了,试试这个:'ViewHolder viewHolder =(ViewHolder)((View)view.getParent())。getTag();;' – Sam 2012-07-05 23:01:47
Sam,我改变我的代码, Log.i(String,String)我已经看到,当我点击复选框时,viewHolder.position是正确的(我的dislapy可以显示8个项目,所以viewHolder.position有一个范围在0,1,2,3。 .7和下一个元素重新启动为0,1,..(用于回收)。使用日志我检查数据[viewHolder.position] .getNamePerson()也适用于每个元素。firts 8个元素(0,1 ,2..7)在列表顶部起作用(当我滚动时,它们的复选框状态被保存)。在第一个8之后的下一个元素仍然存在问题,他们从不保持它们的值 – 2012-07-06 08:08:14