【问题标题】:Change item background color in simple listView在简单的 listView 中更改项目背景颜色
【发布时间】:2015-05-24 15:00:57
【问题描述】:

我想在一个简单的 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];
        }
    });

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

【问题讨论】:

    标签: android listview


    【解决方案1】:

    您错过了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;
        }
    };
    

    这缺少错误检查,但您应该明白这一点。祝你好运!

    【讨论】:

      猜你喜欢
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 2013-06-03
      相关资源
      最近更新 更多