在简单的listView中更改项目背景颜色

时间:2015-05-24 15:00:57

标签: android listview

我想在单击时更改项目背景颜色,在简单的listView中。这是我的代码:

boolean[] selectedItem = new boolean[listElement.length]
final ArrayList<String> list1 = new ArrayList<>();
Collections.addAll(list1, listElement);
final ListView mylist = (ListView) findViewById(R.id.listView);
final ArrayAdapter<String> adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, list1);
mylist.setAdapter(adapter);
mylist.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {

            int firstVisiblePosition = mylist.getFirstVisiblePosition();
            int effectivePosition = pos - firstVisiblePosition;

            if (!selectedItem[pos]) {
                mylist.getChildAt(effectivePosition).setBackgroundColor(Color.parseColor("#66F44336"));
            } else {
                mylist.getChildAt(effectivePosition).setBackgroundColor(Color.parseColor("#EEEEEE"));
            }

           selectedItem[pos] = !selectedItem[pos];
        }
    });

当列表很短(不涉及滚动)时,它可以工作,当它很长时它不会:点击项目的背景颜色确实改变了,但是当我开始滚动每个项目开始变化,我在这些变化中找不到任何逻辑,它们改变和反转,没有我甚至触摸它们,只是通过滚动,这很奇怪,因为颜色应该只在调用onItemClick()时改变,对吧?我错过了什么?

1 个答案:

答案 0 :(得分:3)

你错过了ListView在离开屏幕时重新使用其项目布局的点(即滚动列表)。

您需要为每个项目保存背景,并在请求视图后进行设置。这发生在ListView适配器的getView内。

快速解决方法是在旅途中使用自定义适配器:

final boolean[] selectedItem = new boolean[listElement.length];

ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,
        android.R.layout.simple_list_item_1, list1) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        if (selectedItem[position]) {
            view.setBackgroundColor(Color.parseColor("#66F44336"));
        } else {
            view.setBackgroundColor(Color.parseColor("#EEEEEE"));
        }
        return view;
    }
};

这缺乏错误检查,但你应该明白这个想法。祝你好运!