当我在我的parent.getChildAt(position).setBackgroundColor(Color.GRAY);
中使用public void onItemClick(AdapterView<?> parent, View view, int position, long id)
时,它会着色,但它会很奇怪。
当我点击第一个或第二个项目时,它会将其着色...并且每个项目都会消失〜五个记录。有时候我有NullPointerException。完全奇怪,因为位置是独特的,它应该接收我适当的视图,但它没有。
我看到了覆盖getView方法的解决方案,但我在不同的地方使用这个适配器。我只是想点击点击的项目。如何获得对所选视图的引用?
编辑:
在我创建的适配器类中:
public static int selectedItem = -1;
我将此添加到我的重写getView方法:
if(selectedItem == position){
parent.getChildAt(position).setBackgroundColor(Color.GRAY);
}
在我的活动中,我补充说:
myAdapter.selectedItem = position;
myAdapter.notifyDataSetChanged();
它不起作用。我在哪里犯了错误?
答案 0 :(得分:1)
不是错误 - 这是ListView重新使用视图来节省资源的方式。
因此,为了避免这种行为,您应该在每个getView()上为所有视图设置所有使用的属性。
已更新 - 非常清楚
在您的特定情况下,这意味着您应该设置如下颜色:
1)在onItemClick()中 - 在你的行动能力中 - 你应该记住给定的位置:B1
myAdapter.selectedItem = position
2)在getView()中 - 在适配器中:
if(selectedItem == position)
parent.getChildAt(position).setBackgroundColor(Color.GRAY);
else
parent.getChildAt(position).setBackgroundColor(0);//or whatever defauld color
更新2
如果要选择多个项目,则应使用某种结构(如HashSet)来保存所有选定的项目:
1)在您的活动类中添加成员:
public static HashSet<Integer> mSelectedItems = new HashSet<Integer>();
2)在onItemClick()中使用以下来翻转所选状态:
if(mSelectedItems.contains(position))
mSelectedItems.remove(position);
else
mSelectedItems.add(position);
3)在getView()中:
if(MainActivity.mSelectedItems.contains(position))
parent.getChildAt(position).setBackgroundColor(Color.GRAY);
else
parent.getChildAt(position).setBackgroundColor(0);//or whatever defauld color
答案 1 :(得分:0)
首先阅读this文章;
然后使用ViewHolder
模式;
尝试setBackgroundColor()
onItemClick()
中的 view.setBackgroundColor(0);//or whatever defauld color
:
{{1}}