Android EditText 在 ListView 中滚动时丢失内容

标签 android android-listview

我有一个包含 EditText 的列表项,我不知道会有多少项。当我在 EditText 中输入一些文本,然后向下滚动 ListView 时,我遇到问题,再次向上滚动后,第一个 EditText 中没有文本,或者 ListView 中的其他 EditText 中有一些文本。 代码:

public class MatHangAdapter
        extends ArrayAdapter<MatHangModel> {
    private static final int LAYOUT_ITEM_MAP_DOWNLOAD = R.layout.item_mat_hang;

    private final LayoutInflater mInflater;
    Context context;
    public MatHangAdapter(final Context context) {
        super(context,
              LAYOUT_ITEM_MAP_DOWNLOAD,
              new CopyOnWriteArrayList<MatHangModel>());
        this.mInflater = LayoutInflater.from(context);
        this.context = context;

    }


    /**
     * input  data from outside.
     */
    public void fillData(List<MatHangModel> dataModels) {
        this.clear();
        this.addAll(dataModels);
    }

    @Override
    public long getItemId(final int position) {
        return position;
    }

    @Override

    public View getView(int position,
                        View convertView,
                        ViewGroup parent) {
        final ViewHolder holder;
        if (convertView != null) {
            holder = (ViewHolder) convertView.getTag();
        } else {
            final View view =
                    this.mInflater.inflate(LAYOUT_ITEM_MAP_DOWNLOAD,
                                           parent,
                                           false);
            holder = new ViewHolder(getContext(),
                                    view);

            view.setTag(holder);

            convertView = view;
        }
        //fill data.
        holder.fillData(this.getItem(position));

        return convertView;
    }

    public static class ViewHolder {
        private final Context mContext;
        // Fields.
        @InjectView(R.id.tv_scan_barcode)
        TextView tvScanBarcode;
        @InjectView(R.id.tv_qty_price)
        TextView tvQtyPrice;
        @InjectView(R.id.et_amount)
        EditText etAmount;

        public ViewHolder(Context context,
                          View view) {
            ButterKnife.inject(this,
                               view);// Initialize UI controls.
            mContext = context;
            //apply fonts....
//            CommonUtil.setFontForMainTitleTopicViewRecursive(tvItemMenu);

        }

        /**
         * fill data.
         */
        public void fillData(MatHangModel matHangModel) {
            //fill data
            if (matHangModel != null) {
               tvScanBarcode.setText(CommonUtil.getStringData(matHangModel.getBracode()));
               tvQtyPrice.setText(""+CommonUtil.getIntegerData(matHangModel.getPrice()));
                etAmount.setText(""+CommonUtil.getIntegerData(matHangModel.getAmount()));
                etAmount.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(final CharSequence charSequence,
                                                  int start,
                                                  int before, int count) {
                    }

                    @Override
                    public void onTextChanged(final CharSequence charSequence,
                                              final int i,
                                              final int i1,
                                              final int i2) {
                    }

                    @Override
                    public void afterTextChanged(final Editable editable) {

                    }
                });
            }

        }
        @OnClick(R.id.tv_scan_barcode)
        void onSceanBarcode(View view){
            CommonUtil.showViewWithAnimation(Techniques.FadeIn,view);
        }

    }
}

最佳答案

这是由于 ListView 回收机制造成的,您需要使用 EditText 的新值更新您的 Adapter 数据。

为了获得更好的性能,您可以在 TextWatcherafterTextChanged() 内部执行此操作(仅在完成编辑文本时更新数据):

@Override
public void afterTextChanged(final Editable editable) {
    // update your model
    // matHangModel.setAmount(Integer.parseInt(editable.toString()));
    // update your adapter data with the new value of "matHangModel"
}

编辑

1) 在适配器中添加更新方法:

public void updateItem(MatHangModel model, int position){
    this.insert(model, position);
}

2) 更改您的 fillData 方法以将其作为参数传递给位置,因为您在更新中需要它:

public void fillData(MatHangModel matHangModel, int position) {
            //fill data
            if (matHangModel != null) {
               tvScanBarcode.setText(CommonUtil.getStringData(matHangModel.getBracode()));
               tvQtyPrice.setText(""+CommonUtil.getIntegerData(matHangModel.getPrice()));
                etAmount.setText(""+CommonUtil.getIntegerData(matHangModel.getAmount()));
                etAmount.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(final CharSequence charSequence,
                                                  int start,
                                                  int before, int count) {
                    }

                    @Override
                    public void onTextChanged(final CharSequence charSequence,
                                              final int i,
                                              final int i1,
                                              final int i2) {
                    }

                    @Override
                    public void afterTextChanged(final Editable editable) {
                      matHangModel.setAmount(Integer.parseInt(editable.toString())); // here you update your model data
                      updateItem(matHangModel, position); // here you update your adapter data
                    }
                });
            }

        }

关于Android EditText 在 ListView 中滚动时丢失内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32168522/

相关文章:

android - Gradle 排除或添加硬包含在库 classes.jar 中的 JAR 文件的引用

android - 将基本适配器与异步任务一起使用以显示 ListView

android - 如何使用 Android 分页库向 PagedList 添加 header

java - 应用程序只是强制关闭并停止工作,为什么?

android - 创建分段 ListView

java - Android SQLiteException 语法错误

java - 运行时异常 "can' t 在未调用 Looper.prepare() 的线程内创建处理程序”

Android Intent 和内存

android - 未找到证书路径异常的信任 anchor

android - 如何从 android 中的 SQLite 中检索特定记录