ListView.setSelection(position) 僅捲動使指定位置可見,不會 觸發項目選中高亮。真正的選中高亮需結合 setItemChecked、choiceMode 與 Selector 背景。
android:textSize="16sp" />
ListView listView = findViewById(R.id.calendarList);
listView.setAdapter(adapter);
// 程式碼選中第 2 項(索引 2)
int position = 2;
listView.setItemChecked(position, true); // 關鍵:設定選中狀態
listView.setSelection(position); // 輔助:捲動至可見區域
listView.setOnItemClickListener((parent, view, position, id) -> {
// 清除舊選中(單選模式下自動處理,多選需手動)
for (int i = 0; i < parent.getCount(); i++) {
if (i != position) parent.setItemChecked(i, false);
}
parent.setItemChecked(position, true);
// 取得焦點以顯示 focused 狀態
view.requestFocus();
// 處理業務邏輯
});
| 屬性/方法 | 作用 | 備註 |
|---|---|---|
choiceMode | 單選/多選/無 | singleChoice, multipleChoice, none |
setItemChecked(pos, true) | 程式碼設定選中 | 觸發 state_activated |
setSelection(pos) | 捲動至位置 | 不影響選中狀態 |
activatedBackgroundIndicator | 系統預設選中背景 | API 11+ |
Selector | 自訂 pressed/focused/activated 背景 | 最靈活 |
// Adapter 中
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemView.setActivated(position == selectedPosition);
holder.itemView.setOnClickListener(v -> {
int old = selectedPosition;
selectedPosition = holder.getAdapterPosition();
notifyItemChanged(old);
notifyItemChanged(selectedPosition);
});
}
理解 setSelection 僅負責捲動、選中高亮靠 choiceMode + setItemChecked + Selector,即能正確實現列表項目高亮。