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

ListView Item 含 EditText 保存輸入值:數據源同步 + ViewHolder 模式防止複用丟失

     編輯:程式設計疑難解答

問題

`ListView` 每行含 `EditText`,滑動複用導致輸入內容錯位/丟失。

核心方案:數據源實時同步 + ViewHolder 緩存

public class EditAdapter extends BaseAdapter {
    private List data; // 數據源,與列表項一一對應
    private LayoutInflater inflater;

    public EditAdapter(Context ctx, List initialData) {
        this.data = initialData;
        this.inflater = LayoutInflater.from(ctx);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_edit, parent, false);
            holder = new ViewHolder();
            holder.et = convertView.findViewById(R.id.et_input);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        // 1. 移除舊監聽(防止多次添加)
        if (holder.watcher != null) holder.et.removeTextChangedListener(holder.watcher);

        // 2. 設置當前數據
        holder.et.setText(data.get(position));

        // 3. 添加新監聽,實時回寫數據源
        holder.watcher = new TextWatcher() {
            @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
            @Override public void onTextChanged(CharSequence s, int start, int before, int count) {}
            @Override public void afterTextChanged(Editable s) {
                data.set(position, s.toString()); // 關鍵:即時更新數據源
            }
        };
        holder.et.addTextChangedListener(holder.watcher);

        return convertView;
    }

    static class ViewHolder {
        EditText et;
        TextWatcher watcher;
    }

    // 獲取最終數據
    public List getData() { return data; }
}

關鍵點

  1. `data` 列表與 `position` **強綁定**,`afterTextChanged` 直接 `data.set(position, ...)`。
  2. `ViewHolder` 緩存 `TextWatcher` 引用,**複用前移除舊監聽**,避免位置錯亂。
  3. 提交時調用 `adapter.getData()` 獲取最新列表。

進階:RecyclerView 更簡潔

`RecyclerView.Adapter` 配合 `onBindViewHolder` 邏輯相同,但 `ViewHolder` 生命週期更清晰,推薦遷移。

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