直接在 getView() 中對按鈕呼叫 setClickable(false) 或 setEnabled(false) 往往失效,原因在於 ListView 的視圖復用機制:convertView 被重用時,按鈕狀態會隨著數據還原。
boolean isClicked)。// 1. 數據模型
class Item {
String title;
boolean clicked = false;
}
// 2. Adapter 關鍵邏輯
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Item item = getItem(position);
holder.title.setText(item.title);
holder.btn.setEnabled(!item.clicked); // 根據數據設置狀態
holder.btn.setOnClickListener(v -> {
item.clicked = true; // 更新數據
notifyDataSetChanged(); // 刷新視圖
// 執行業務邏輯...
});
return convertView;
}
若專案允許,建議遷移至 RecyclerView,其 ViewHolder 模式強制分離視圖與數據,配合 DiffUtil 實現局部刷新,性能與維護性更優。
ListView 按鈕禁用的核心原則是 「數據驅動視圖」:狀態保存在數據模型,Adapter 负責同步,點擊修改數據後刷新。切勿嘗試直接操作視圖並期望狀態持久化。