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

Android ListView 外部控制 Item 內刪除按鈕顯隱:Adapter 模式切換法

     編輯:程式設計綜合問答

需求:標題欄「編輯」按鈕切換為「完成」,ListView 所有 Item 內的刪除按鈕同步顯示/隱藏。核心思路:在 Adapter 中維護編輯模式狀態,notifyDataSetChanged() 刷新視圖。

實現方案

public class MyAdapter extends BaseAdapter {
    private boolean isEditMode = false;
    private List<ItemData> dataList;
    private Context context;

    // 關鍵:提供切換編輯模式的公共方法
    public void setEditMode(boolean editMode) {
        this.isEditMode = editMode;
        notifyDataSetChanged(); // 觸發 getView 重新綁定
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.item_layout, parent, false);
            holder = new ViewHolder();
            holder.deleteBtn = convertView.findViewById(R.id.btn_delete);
            // ... 其他控件
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        // 核心邏輯:根據 isEditMode 顯隱刪除按鈕
        holder.deleteBtn.setVisibility(isEditMode ? View.VISIBLE : View.GONE);
        
        // 綁定數據...
        return convertView;
    }
    
    static class ViewHolder { Button deleteBtn; /* ... */ }
}

// Activity/Fragment 中調用
editBtn.setOnClickListener(v -> {
    isEditing = !isEditing;
    editBtn.setText(isEditing ? "完成" : "編輯");
    adapter.setEditMode(isEditing); // 一行代碼搞定所有 Item
});

關鍵點解析

  1. 狀態集中管理:編輯模式旗標放在 Adapter,而非分散在各 Item 或 ViewHolder 中。
  2. notifyDataSetChanged():切換模式後必須調用,通知 ListView 重新調用 getView 更新所有可見 Item。
  3. ViewHolder 模式:復用 convertView,避免重複 findViewById,提升滾動流暢度。
  4. 避免直接操作 View:不要嘗試遍歷 ListView 子 View 設置可見性,會因視圖回收導致錯亂。

進階:動畫過渡

為提升體驗,可在 setEditMode 中配合 ViewPropertyAnimator 添加淡入淡出動畫:

holder.deleteBtn.animate()
    .alpha(isEditMode ? 1f : 0f)
    .setDuration(200)
    .withEndAction(() -> holder.deleteBtn.setVisibility(isEditMode ? View.VISIBLE : View.GONE))
    .start();

此模式同樣適用於多選模式、拖拽排序等列表批量操作場景,是 Android 列表交互的標準範式。

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