如何为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,记录每个项的颜色状态:
- 定义数组保存每个位置的初始背景色:
private int[] itemColors = new int[]{Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT};
- 自定义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(); } }
- 在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
相关产品推荐
相关产品推荐

