我有一个自定义列表视图,项目布局左侧有一个复选框,4个文本视图很像astrid任务管理器。
我打算做的是,在单击复选框时,textview必须更新其值。起初,我的问题是,在检查位置1处的复选框时,会在滚动时检查结尾处或其他位置的复选框。在寻找解决方案时,我开始了解listview中视图的回收。我应用了像viewholder这样的概念,现在我能够保持复选框的状态。但是,在复选框上单击时,我更改了文本视图,并且更改不会持续存在,这意味着任何随机电视也会显示相同的更改。
我在我的适配器中应用了一个复选框onclicklistener。任何想法如何实现它?
答案 0 :(得分:0)
您需要在项目数据中而不是在视图持有者中保留项目的状态。视图持有者只是方便视图,在不同时间将显示许多不同的项目,假设您回收视图。在数据绑定期间,您需要绑定显示项目所需的所有状态,以避免在其他列表项的视图中显示随机数据。
public class MyListAdapter extends BaseAdapter {
// ....
@Override
View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = inflate(R.layout.my_list_item_layout, parent, false);
// View holder just prevents having to look up these values
// every time the view is reused.
MyViewHolder holder = new MyViewHolder();
holder.checkbox = (CheckBox) view.findViewById(R.id.check_box);
holder.textview = (TextView) view.findViewById(R.id.text_view);
view.setTag(holder);
}
final MyViewHolder holder = (MyViewHolder) view.getTag();
final MyData data = (MyData) getItem(position);
holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
data.savedCheckboxState = isChecked;
// now tell the view to rebind the data
notifyDataSetChanged();
}
});
holder.checkbox.setChecked(data.savedCheckboxState);
holder.textview.setText(String.valueOf(data.savedCheckboxState));
return view;
}
private static class MyViewHolder {
CheckBox checkbox;
TextView textview;
}
}
答案 1 :(得分:0)
你可以在这里参考我的完整代码,你可以做的是,在一个布尔数组中存储复选框状态,然后你不会遇到这个问题......