在列表视图中将值设置为edittext

时间:2014-10-07 05:07:19

标签: android android-listview

我正在使用自定义列表视图,其中包含两个按钮是或否。当我单击否按钮时,将显示包含编辑文本的布局。列表视图中有超过15个项目。当我尝试使用TextWatcher()在第1项的edittext中键入并保存该值时,将为第5和第1位置保存该值,即在第1和第5位置保存相同的值。 我正在使用的代码是:

    holder.subQuestionAnswer.addTextChangedListener( new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            questionsModel.get(position).getQuestion_subquestion().get(0).setAnswer(holder.subQuestionAnswer.getText()
                    .toString());   

            Log.e("value", "no_active<>"+position+"<>"+questionsModel.get(position).getQuestion_subquestion().get(0).getAnswer().toString());
        }
    });
}

我该如何避免这种情况?

1 个答案:

答案 0 :(得分:1)

这是因为回收视图。请检查以下适配器。根据您的需要使用逻辑。

public class MultiSelectionProductAdapter extends ArrayAdapter<ProductListBean> {

private Context context;
private ArrayList<ProductListBean> productList;
private ArrayList<ProductListBean> mOriginalValues;
private LayoutInflater li;


public MultiSelectionProductAdapter(Context ctx, int simpleListItem1,
                                    ArrayList<ProductListBean> data) {
    super(ctx, simpleListItem1, data);

    this.context = ctx;
    this.productList = data;
    li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

@Override
public int getCount() {
    return productList.size();
}

@Override
public ProductListBean getItem(int position) {
    return productList.get(position);
}

@Override
public long getItemId(int position) {

    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    final ViewHolder holder;

    if (convertView == null) {

        convertView = li.inflate(R.layout.component_inventory_prod_list, null);
        holder = new ViewHolder();

        holder.tvProductName = (TextView) convertView.findViewById(R.id.tvProductName);
        holder.tvProdShortCode = (TextView) convertView.findViewById(R.id.tvShortName);
        holder.tvLastOrderedQty = (TextView) convertView.findViewById(R.id.tvLastOrderedQty);
        holder.etQty = (EditText) convertView.findViewById(R.id.etQty);
        holder.parentRL = (LinearLayout) convertView.findViewById(R.id.parentRL);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    final ProductListBean tempBean = productList.get(position);
    holder.etQty.setId(position);
    final String productName = tempBean.getProductName();
    final String productCode = tempBean.getProductCode();
    final String productShortCode = tempBean.getProductShortCode();

    if (mSelectedProd != null && mSelectedProd.contains(productCode)) {
        final int indexOfProd = mSelectedProd.indexOf(productCode);
        holder.etQty.setText(mSelectedProducts.get(indexOfProd).getEnteredQty());
    }

    holder.tvProductName.setText(productName);
    holder.tvProdShortCode.setText(productShortCode);
    holder.tvLastOrderedQty.setText(tempBean.getLastOrderedQty());
    holder.etQty.setText(tempBean.getEnteredQty());

    holder.parentRL.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            holder.etQty.requestFocus();
        }
    });


    holder.etQty.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            final int pos = holder.etQty.getId();
            final String qty = holder.etQty.getText().toString();
            if (qty.length() > 0) {
                if (String.valueOf(qty.charAt(0)).equals("0")) {
                    holder.etQty.setError("Invalid Quantity");
                    holder.etQty.setText("");
                } else {
                    productList.get(pos).setEnteredQty(holder.etQty.getText().toString());
                }
            } else {
                productList.get(pos).setEnteredQty("");
            }
        }
    });

    return convertView;
}

static class ViewHolder {
    TextView tvProductName, tvProdShortCode, tvLastOrderedQty;
    EditText etQty;
    LinearLayout parentRL;
}