`ListView` 每行含 `EditText`,滑動複用導致輸入內容錯位/丟失。
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; }
}
`RecyclerView.Adapter` 配合 `onBindViewHolder` 邏輯相同,但 `ViewHolder` 生命週期更清晰,推薦遷移。