在我的应用中,我使用的自定义ListView
包含ImageView
,TextView
,按钮和CheckBox
。问题是,如果我检查列表项0,项目5&还选择了9。我已经阅读了this文章并尝试实施该系统,但无济于事。以下是我正在使用的代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
view = convertView;
item=items.get(position);
if (view == null) {
view = inflater.inflate(R.layout.layout_marine, parent, false);
holder = new ViewHolder();
holder.pic = (ImageView) view.findViewById(R.id.imageViewPic);
holder.title = (TextView) view.findViewById(R.id.textViewTitle);
holder.phone = (TextView) view.findViewById(R.id.textViewPhone);
holder.address = (TextView) view.findViewById(R.id.textViewAddress);
holder.btnFav=(CheckBox) view.findViewById(R.id.buttonFav);
cbFav=holder.btnFav;
holder.btnFav.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
DirectoryItem elem=(DirectoryItem) holder.btnFav.getTag();
if(elem.isFav() && buttonView.isChecked()){// check if already added or deleted.
return;
}
if(!elem.isFav() && !buttonView.isChecked()){
return;
}
elem.setFav(buttonView.isChecked());
if(isChecked){
AddToFavourites add=new AddToFavourites(context, cbFav);
add.execute(String.valueOf(elem.getId()));
}else{
RemoveFromFavourites remove=new RemoveFromFavourites(context, cbFav);
remove.execute(String.valueOf(elem.getId()));
}
}
});
holder.btnFav.setTag(item);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
loader.displayImage(item.getImgUrl(), holder.pic, options);
holder.title.setText(item.getTitle());
holder.phone.setText(item.getPhone());
holder.address.setText(item.getAddress());
holder.btnFav.setChecked(item.isFav());
firstTime=false;
return view;
}
我在这里遗漏了什么吗?请帮我提一下你的建议。提前谢谢。
我改变了上面的代码,现在它显示了一个奇怪的行为。项目I检查在退出视图后不会保持检查状态。而是检查其他一些项目。我还有一个问题 - 我正在维护ArrayList
DirectoryItems
,其中包含一个布尔值,指定是否选择了该项。我是否可以使用它来访问CheckBox
的状态,而不是将其放入标记并从那里访问它?如果不是为什么会这样,因为以这种迂回的方式做这件事似乎是非常直观的。
答案 0 :(得分:0)
我认为问题是单击复选框后您的items
结构没有刷新。检查item.isFav()
是否填写正确
答案 1 :(得分:0)
holder.btnFav.setTag(item);在if部分中也需要放入else部分
holder.btnFav.setTag(item);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
holder.btnFav.setTag(item);
}
因为复选框已被回收,标签必须刷新。
答案 2 :(得分:0)
你必须通过...维持列表中的复选框状态 field boolean isChecked;在项目 - > ArrayList的即可。并检查状态 ...在 getView(..)
中
getView(){
.......
holder.btnFav.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
items.isChecked=isChecked;
if(isChecked){
..........
}else{
.............
}
}
});
holder.btnFav.setChecked(items.isChecked);
......
}