You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为ListView中每个被点击项设置不同背景色?setBackgroundColor()仅设单一颜色

实现ListView点击项设置对应背景色

方式一:点击时直接设置(简单场景,无View复用需求)

直接给ListView添加OnItemClickListener,根据点击位置设置对应背景色:

public class SecondActivity extends AppCompatActivity {

    private String [] myList = new String[]{"Blue", "Green", "Red"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        ListView listView = findViewById(R.id.ListView);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, android.R.id.text1, myList);

        listView.setAdapter(adapter);

        // 添加点击事件处理
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // 根据位置匹配对应颜色
                switch (position) {
                    case 0:
                        view.setBackgroundColor(Color.BLUE);
                        break;
                    case 1:
                        view.setBackgroundColor(Color.GREEN);
                        break;
                    case 2:
                        view.setBackgroundColor(Color.RED);
                        break;
                    default:
                        view.setBackgroundColor(Color.TRANSPARENT);
                        break;
                }
            }
        });
    }
}

方式二:点击后保留颜色(适配View复用,滚动不丢失状态)

ListView会复用列表项View,直接在点击事件设置颜色会导致滚动后颜色错乱。这种情况需要自定义Adapter,记录每个项的颜色状态:

  1. 定义数组保存每个位置的初始背景色:
private int[] itemColors = new int[]{Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT};
  1. 自定义ArrayAdapter,在getView方法中读取记录的颜色设置背景:
public class MyCustomAdapter extends ArrayAdapter<String> {
    private int[] itemColors;

    public MyCustomAdapter(Context context, int resource, String[] objects, int[] itemColors) {
        super(context, resource, objects);
        this.itemColors = itemColors;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        // 设置保存的背景色
        view.setBackgroundColor(itemColors[position]);
        return view;
    }

    // 提供方法更新指定位置的颜色
    public void updateItemColor(int position, int color) {
        itemColors[position] = color;
        notifyDataSetChanged();
    }
}
  1. 在Activity中使用自定义Adapter,并在点击事件更新颜色:
public class SecondActivity extends AppCompatActivity {

    private String [] myList = new String[]{"Blue", "Green", "Red"};
    private int[] itemColors = new int[]{Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        ListView listView = findViewById(R.id.ListView);
        MyCustomAdapter adapter = new MyCustomAdapter(this,
                android.R.layout.simple_list_item_1, myList, itemColors);

        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                int targetColor;
                switch (position) {
                    case 0:
                        targetColor = Color.BLUE;
                        break;
                    case 1:
                        targetColor = Color.GREEN;
                        break;
                    case 2:
                        targetColor = Color.RED;
                        break;
                    default:
                        targetColor = Color.TRANSPARENT;
                        break;
                }
                // 更新对应位置的颜色并通知Adapter刷新
                adapter.updateItemColor(position, targetColor);
            }
        });
    }
}

补充说明

  • 如果列表项文本是动态的,也可以根据文本内容匹配颜色,比如通过myList[position]判断是"Blue"就设蓝色,无需依赖位置。
  • 可以用Color.parseColor("#XXXXXX")设置自定义十六进制颜色,比如Color.parseColor("#0000FF")等价于Color.BLUE。

内容的提问来源于stack exchange,提问作者avvvv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:25:18