GridView 加載含 CheckBox 的 Item,若 CheckBox 可點擊會攔截觸摸事件,導致 `OnItemClickListener` 失效。解法:禁用 CheckBox 焦點/點擊,邏輯集中在 Item 層。
<CheckBox
android:id="@+id/cb_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
android:background="@null" />
public class MyAdapter extends BaseAdapter {
private final Set checkedPositions = new HashSet<>();
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.grid_item, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.cbSelect.setChecked(checkedPositions.contains(position));
return convertView;
}
public void toggle(int position) {
if (checkedPositions.contains(position)) checkedPositions.remove(position);
else checkedPositions.add(position);
notifyDataSetChanged();
}
public List getCheckedPositions() {
return new ArrayList<>(checkedPositions);
}
}
gridView.setOnItemClickListener((parent, view, position, id) -> {
adapter.toggle(position);
// 更新底部預覽/發送按鈕狀態
updateBottomBar(adapter.getCheckedPositions().size());
});
此模式避免事件分發衝突,代碼清晰,擴展性強(可加長按進入選擇模式、全選/反選等)。