需求:標題欄「編輯」按鈕切換為「完成」,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
});
getView 更新所有可見 Item。findViewById,提升滾動流暢度。為提升體驗,可在 setEditMode 中配合 ViewPropertyAnimator 添加淡入淡出動畫:
holder.deleteBtn.animate()
.alpha(isEditMode ? 1f : 0f)
.setDuration(200)
.withEndAction(() -> holder.deleteBtn.setVisibility(isEditMode ? View.VISIBLE : View.GONE))
.start();
此模式同樣適用於多選模式、拖拽排序等列表批量操作場景,是 Android 列表交互的標準範式。