Android EditText在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 s的新值更新您的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在ListView中回收视图,所以你在EditText中输入的文本可能会丢失,如果你不存储它。

TextWatcheronTextChanged方法中存储您输入的文本,例如matHangModel.setAmount(etAmount.getText().toString())

试试这个:

@Override
 public void onTextChanged(final CharSequence charSequence,
                                              final int i,
                                              final int i1,
                                              final int i2) {
 matHangModel.setAmount(charSequence.toString());  //if amount is int then parse value. In layout EditText set android:inputType="number"
            android:ems="10"
}

最新更新