更改ListView项目背景错误

时间:2015-02-16 11:50:08

标签: android listview

当我在我的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();

它不起作用。我在哪里犯了错误?

2 个答案:

答案 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}}