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

AutoCompleteTextView 下拉歷史記錄項目添加刪除按鈕的實作

     編輯:程式設計疑難解答

需求

為 AutoCompleteTextView 下拉清單中的每條歷史記錄添加一個「刪除」按鈕,點擊可移除該條記錄。

核心思路:自訂 Adapter 覆寫 getView

  1. 繼承 ArrayAdapter<String> 或 CursorAdapter。
  2. 在 getView() 中為每個項目 inflate 包含 TextView + ImageButton 的佈局。
  3. 為刪除按鈕設定 OnClickListener,移除資料源對應項目並 notifyDataSetChanged()。
  4. 實作 Filterable 介面以支援過濾邏輯(或直接使用 ArrayAdapter 內建過濾)。

關鍵程式碼片段

public class HistoryAdapter extends ArrayAdapter implements Filterable {
    private List originalData;
    private OnDeleteListener deleteListener;

    public HistoryAdapter(Context context, List data, OnDeleteListener listener) {
        super(context, R.layout.item_history, data);
        this.originalData = new ArrayList<>(data);
        this.deleteListener = listener;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_history, parent, false);
            holder = new ViewHolder();
            holder.text = convertView.findViewById(R.id.tv_text);
            holder.btnDelete = convertView.findViewById(R.id.btn_delete);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final String item = getItem(position);
        holder.text.setText(item);
        holder.btnDelete.setOnClickListener(v -> {
            // 從原始資料移除
            originalData.remove(item);
            // 通知刷新
            notifyDataSetChanged();
            // 回調外部持久化邏輯
            if (deleteListener != null) deleteListener.onDelete(item);
        });
        return convertView;
    }

    // 保持過濾功能
    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                if (constraint == null || constraint.length() == 0) {
                    results.values = originalData;
                    results.count = originalData.size();
                } else {
                    List filtered = new ArrayList<>();
                    for (String s : originalData) {
                        if (s.contains(constraint)) filtered.add(s);
                    }
                    results.values = filtered;
                    results.count = filtered.size();
                }
                return results;
            }
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                clear();
                if (results.values != null) {
                    addAll((List) results.values);
                }
                notifyDataSetInvalidated();
            }
        };
    }

    static class ViewHolder { TextView text; ImageButton btnDelete; }
    interface OnDeleteListener { void onDelete(String item); }
}

佈局 item_history.xml

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="12dp">
    <TextView android:id="@+id/tv_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
    <ImageButton android:id="@+id/btn_delete"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:src="@android:drawable/ic_delete"
        android:background="?attr/selectableItemBackgroundBorderless" />
</LinearLayout>

使用方式

AutoCompleteTextView actv = findViewById(R.id.actv);
List history = loadHistory(); // 從 SharedPreferences/DB 載入
HistoryAdapter adapter = new HistoryAdapter(this, history, item -> {
    saveHistory(history); // 持久化
});
actv.setAdapter(adapter);

參考資源

CSDN 完整教學

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