listView中的checkbox的错位问题

小小亠星辰 2016-09-02 05:34:32
找了很多网上的解释,照着敲都感觉不对 代码如下,求指教:


class myAdapter extends BaseAdapter{
private int index;
private viewHolder viewholder;
private Map<Integer,Boolean> map;
public myAdapter(Map<Integer, Boolean> map) {
this.map = map;
}
@Override
public int getCount() {
return 10000;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
index = i;
if(view == null){
view =View.inflate(MainActivity.this, R.layout.items, null);;
viewholder = new viewHolder();
viewholder.checkBox = (CheckBox) view.findViewById(R.id.cb);
view.setTag(viewholder);
}else{
viewholder = (viewHolder)view.getTag();
}
viewholder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
map.put(index,viewholder.checkBox.isChecked());
}
});
if(map.get(index)){
viewholder.checkBox.setChecked(true);
}else
viewholder.checkBox.setChecked(false);
return view;
}
}
class viewHolder{
TextView textView;
CheckBox checkBox;
}
}
...全文
461 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯狂的兔子ccc 2016-09-06
  • 打赏
  • 举报
回复
我看错了,你保存的地方没问题
疯狂的兔子ccc 2016-09-06
  • 打赏
  • 举报
回复
这个是复用的问题,不要复用了,你把if==null 的判断去掉 然后这个保存的地方当你划出屏幕也会自动设置成false
qq_26763799 2016-09-05
  • 打赏
  • 举报
回复
checkbox,edittext这些在listview中最好不要复用,复用了 滑动后就会出现错乱的
张可_ 2016-09-05
  • 打赏
  • 举报
回复
我也遇到过类似的问题,是因为在myAdapter 设置了view重用,把 if(view == null){ view =View.inflate(MainActivity.this, R.layout.items, null);; viewholder = new viewHolder(); viewholder.checkBox = (CheckBox) view.findViewById(R.id.cb); view.setTag(viewholder); }else{ viewholder = (viewHolder)view.getTag(); } 改为: view =View.inflate(MainActivity.this, R.layout.items, null);; viewholder = new viewHolder(); viewholder.checkBox = (CheckBox) view.findViewById(R.id.cb); view.setTag(viewholder); 试试,不要判断view是否为null。
xmoon1983 2016-09-04
  • 打赏
  • 举报
回复
viewholder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { map.put(index,viewholder.checkBox.isChecked()); // 这里错了 }}); 整个adapter只有一个index,也就是说,这个值是所有item共用的。 假设有3条数据,listview加载完毕后,index的值是2。 这时我分别点击item1 item2 item3中的checkbox, 给 map.put传递的index都是2,而不是 0 1 2。 解决办法: 1、删除index 2、给checkbox打tag、记录位置:viewholder.checkBox.setTag(i); 3、 viewholder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Integer n = (Integer) view.getTag(); map.put(n,viewholder.checkBox.isChecked()); }});
小小亠星辰 2016-09-03
  • 打赏
  • 举报
回复
引用 4 楼 qq_35619786 的回复:
[quote=引用 3 楼 qq_25412055 的回复:] getCount 应该return map.size() getItemId return i; getItem return map.get(i)
这3个方法不一定要照你说的这么写啊,getItemId和getItem不用到的话可以返回默认值,getCount楼主写个1W也没问题,也就测试一下 楼主代码逻辑看起来问题不大, return view;这句应该是要写在if判断外面一层,不知道是不是这个原因导致的错位,请仔细说明下错位的情况, [/quote] 我也感觉那三个方法不会影响结果 错位是 checkbox状态错位 比如说 我在第一个条目上选中的checkbox
引用 10 楼 qq_35619786 的回复:
if是在最外层了,可是return 在if里面,这样的代码是不行的吧 错位一般是viewHolder复用导致,但是他有弄一个集合记录点击过的Item,让其被选中位置会记录下来,并显示被选中,这种情况下,复用时也会考虑当前位置的状态来决定选中的状态吧
return是在该函数的最外层 else的大括号省略了 的确是复用导致的 我也用了集合保存状态 可是还是错位
lucers 2016-09-03
  • 打赏
  • 举报
回复
if是在最外层了,可是return 在if里面,这样的代码是不行的吧 错位一般是viewHolder复用导致,但是他有弄一个集合记录点击过的Item,让其被选中位置会记录下来,并显示被选中,这种情况下,复用时也会考虑当前位置的状态来决定选中的状态吧
小小亠星辰 2016-09-03
  • 打赏
  • 举报
回复
引用 3 楼 qq_25412055 的回复:
getCount 应该return map.size() getItemId return i; getItem return map.get(i)
数据源是我的引用的一个布局 只是一个textview加上一个checkbox 数据源没那么讲究 我就随便给了一个值让返回 另外两个方法我没有用到 就没有写 都是直接重载来的 这会关系到最后的结果么? 我待会试试
小小亠星辰 2016-09-03
  • 打赏
  • 举报
回复
引用 1 楼 qq_23169015 的回复:
代码没什么大问题吧,你说的错位是checkbox显示位置错位还是本来该选中的没选中这种错位
是checkbox的状态错位 请问怎么破
小小亠星辰 2016-09-03
  • 打赏
  • 举报
回复
感谢大家的指教,之前的确是我没有说清楚 错位问题是指checkbox的状态错位
LoveWyf_ 2016-09-03
  • 打赏
  • 举报
回复
引用 4 楼 qq_35619786 的回复:
[quote=引用 3 楼 qq_25412055 的回复:] getCount 应该return map.size() getItemId return i; getItem return map.get(i)
这3个方法不一定要照你说的这么写啊,getItemId和getItem不用到的话可以返回默认值,getCount楼主写个1W也没问题,也就测试一下 楼主代码逻辑看起来问题不大, return view;这句应该是要写在if判断外面一层,不知道是不是这个原因导致的错位,请仔细说明下错位的情况, [/quote] 他这个if已经是在最外层了。只是没加大括号而已,那三个方法像他这么写,直接导致了listview的item点击事件没用,至于会不会影响到getview中内部checkbox的click事件这个我不知道,像这种错位问题一般都是viewholder重用导致的。
lucers 2016-09-03
  • 打赏
  • 举报
回复
另外你整个类中没必要再定义一个index,直接使用i就可以了
lucers 2016-09-03
  • 打赏
  • 举报
回复
引用 3 楼 qq_25412055 的回复:
getCount 应该return map.size() getItemId return i; getItem return map.get(i)
这3个方法不一定要照你说的这么写啊,getItemId和getItem不用到的话可以返回默认值,getCount楼主写个1W也没问题,也就测试一下 楼主代码逻辑看起来问题不大, return view;这句应该是要写在if判断外面一层,不知道是不是这个原因导致的错位,请仔细说明下错位的情况,
LoveWyf_ 2016-09-02
  • 打赏
  • 举报
回复
getCount 应该return map.size() getItemId return i; getItem return map.get(i)
LoveWyf_ 2016-09-02
  • 打赏
  • 举报
回复
getCoun getItem getItemId都写的不对
疯狂的兔子ccc 2016-09-02
  • 打赏
  • 举报
回复
代码没什么大问题吧,你说的错位是checkbox显示位置错位还是本来该选中的没选中这种错位

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧