我有一个列表视图,每个项目都有一个开/关按钮。
加载时,所有用户都关闭。我按下user1,它会打开并将标签设置为“on”。当我向下滚动时,user7打开。在我的日志中,我可以看到user7正在从user1获取标记。向上和向下滚动似乎会继续这种收集错误标签的视图模式。
之前我遇到过listview回收的问题,但只是确保我在getView中正确设置了所有内容。
不幸的是,经过数小时和数小时的故障排除/反复试验后,我还没有解决问题。
非常感谢任何帮助!
这是我的getview。我编号并将用户名添加到日志标记中,以便我可以看到正在调用哪一个用于确定项目1中的标记用于项目7等等:
@Override
public View getView(int position, View convertView, ViewGroup parent){
final ViewHolder holder;
if (convertView == null){
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.name = (TextView)convertView.findViewById(R.id.name);
holder.availablebutton = (ImageView)convertView.findViewById(R.id.availablebutton);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
final HashMap<String,String> item = (HashMap<String,String> ) items.get(position);
if (item != null)
{
if (holder.availablebutton.getTag() != null) {
Log.d("AB gettag is not null:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
if (("on").equals(holder.availablebutton.getTag().toString())) {
holder.availablebutton.setImageResource(R.drawable.on1);
Log.d("tag 1:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
}
else {
holder.availablebutton.setImageResource(R.drawable.off1);
Log.d("tag 2:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
}
} else {
if ("2".equals(item.get(TAG_AVAILABLE))) {
holder.availablebutton.setImageResource(R.drawable.on1);
holder.name.setTag("on");
Log.d("tag 3:", holder.name.getTag() + item.get(TAG_USERNAME));
}
else {
holder.availablebutton.setImageResource(R.drawable.off1);
holder.name.setTag("off");
Log.d("tag 4:", holder.name.getTag() + item.get(TAG_USERNAME));
}
}
holder.availablebutton.setOnTouchListener(
new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event) {
if (holder.availablebutton.getTag() != null) {
if (("on").equals(holder.availablebutton.getTag().toString())) {
holder.availablebutton.setImageResource(R.drawable.off1);
holder.availablebutton.setTag("off");
Log.d("button pressed 1:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
}
else {
holder.availablebutton.setImageResource(R.drawable.on1);
holder.availablebutton.setTag("on");
Log.d("button pressed 2:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
}
} else {
if (("on").equals(holder.name.getTag().toString())) {
holder.availablebutton.setImageResource(R.drawable.off1);
holder.availablebutton.setTag("off");
Log.d("button pressed 3:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
}
else {
holder.availablebutton.setImageResource(R.drawable.on1);
holder.availablebutton.setTag("on");
Log.d("button pressed 4:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
}
}
return false;
}
}
);
}
return convertView;
}
这是我的logcat,我希望它有道理:
第一次加载:
07-22 23:41:00.948: D/tag 4:(27178): offUser1
07-22 23:41:00.958: D/tag 4:(27178): offUser2
07-22 23:41:00.968: D/tag 4:(27178): offUser3
07-22 23:41:00.978: D/tag 4:(27178): offUser4
按下用户1的按钮:
07-22 23:41:09.148: D/button pressed 4:(27178): onUser1
按下按钮后向下滚动:
07-22 23:41:15.438: D/tag 4:(27178): offUser5
07-22 23:41:15.488: D/tag 4:(27178): offUser6
07-22 23:41:15.518: D/AB gettag is not null:(27178): onUser7
07-22 23:41:15.518: D/tag 1:(27178): onUser7
07-22 23:41:15.548: D/tag 4:(27178): offUser8
答案 0 :(得分:1)
您无法仅在Tag中保留该值。当视图被回收时,意味着当滚动时视图关闭时,列表视图中将出现完全相同的视图。这就是在getView方法中使用convertView的原因。您可以使用新数据填充此循环视图,但它看起来不错,但您的标记仍然相同。 即使你不回收视图(总是在不使用convertView的情况下充气) - 它仍然无法工作,因为你的标签只是垃圾收集。
您需要做的是例如:创建一个外部哈希集,其中保存所有打开的ID。在getView方法中,您可以检查您的id是否在hashset中,并执行您想要执行的操作。
此外,当您需要的唯一案例是您的列表项目的ON / OFF时 - CHOICE_MODE_MULTIPLE将是一个不错的选择。你需要阅读更多关于它的信息START HERE。