首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ListView 中按鈕點擊後禁用的正確姿勢

     編輯:程式設計綜合問答

常見誤區

直接在 getView() 中對按鈕呼叫 setClickable(false) 或 setEnabled(false) 往往失效,原因在於 ListView 的視圖復用機制:convertView 被重用時,按鈕狀態會隨著數據還原。

正確做法:數據驅動視圖

  1. 在數據模型中增加狀態字段(如 boolean isClicked)。
  2. 在 Adapter 的 getView() 中根據該字段設置按鈕狀態。
  3. 點擊事件中更新數據並刷新。

代碼範例

// 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

若專案允許,建議遷移至 RecyclerView,其 ViewHolder 模式強制分離視圖與數據,配合 DiffUtil 實現局部刷新,性能與維護性更優。

總結

ListView 按鈕禁用的核心原則是 「數據驅動視圖」:狀態保存在數據模型,Adapter 负責同步,點擊修改數據後刷新。切勿嘗試直接操作視圖並期望狀態持久化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved