我有什麼:用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