修改 GridView Item 按下時的背景顏色,替換系統默認選中效果。
在 Adapter 中維护選中位置,getView 根據位置設置背景,點擊事件更新位置並刷新。
public class MyGridAdapter extends BaseAdapter {
private int selectedPosition = -1; // 記錄選中位置
public void setSelection(int position) {
selectedPosition = position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.grid_item, parent, false);
}
// 關鍵:根據選中狀態設置背景
if (position == selectedPosition) {
view.setBackgroundResource(R.drawable.grid_item_selected);
} else {
view.setBackgroundResource(R.drawable.grid_item_normal);
}
// 綁定數據...
return view;
}
}
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/colorPressed" />
<item android:state_selected="true" android:drawable="@color/colorSelected" />
<item android:drawable="@color/colorNormal" />
</selector>
佈局中直接應用:android:background="@drawable/grid_item_selector"
gridView.setOnItemClickListener((parent, view, position, id) -> {
adapter.setSelection(position);
adapter.notifyDataSetChanged(); // 刷新背景
// 執行業務邏輯...
});
// Adapter 中使用 Set 記錄多選位置
private Set selectedPositions = new HashSet<>();
public void toggleSelection(int position) {
if (selectedPositions.contains(position)) {
selectedPositions.remove(position);
} else {
selectedPositions.add(position);
}
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// ...
boolean isSelected = selectedPositions.contains(position);
view.setBackgroundResource(isSelected ? R.drawable.selected : R.drawable.normal);
// ...
}

通過 Adapter 維護選中狀態並在 getView 中動態設置背景,配合 Selector Drawable,可完全自定義 GridView Item 的按下、選中、正常狀態樣式。