ListView中的EditTexts值随机复制

时间:2016-04-04 10:35:30

标签: android

我有listview,每行都有一个Edittext和Button。当我在第一行的Edittext中插入值时,我向下滚动列表,我发现ListView中的其他一些EditText填充了相同的值。我怎么能防止这种情况。请帮帮我。

这是我的代码

public class ItemsAdapter extends ArrayAdapter<Items>{


Double Price;
Double Quantity;
String  _Quantity;
private int resource;
private LayoutInflater inflater;
private Context context;
Items items;
List<Items> objects;

private ArrayList<String> externalArray = new ArrayList<String>();

public ItemsAdapter(Context ctx, int resourceId, List<Items> objects){

    super( ctx, resourceId, objects );
    resource = resourceId;
    inflater = LayoutInflater.from( ctx );
    context=ctx;
    this.objects=objects;


    for(int i =0; i< objects.size();i ++ )
    {
       externalArray.add(i,"");
    }
}



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

@Override
public Items getItem(int position) {
    return objects.get(position);
}


@Override
public long getItemId(int position) {
    return 0;
}
@Override
public View getView (final int position, View convertView, ViewGroup parent ) {


 final   ItemViewHolder viewHolder;
    items = getItem( position );

    if (convertView == null) {


        convertView=( RelativeLayout ) inflater.inflate( resource,null);

        viewHolder=new ItemViewHolder();

      //  LayoutInflater.from(context).inflate(R.layout.list_items, parent, false);

        viewHolder.btnAddToCart=(Button)convertView.findViewById(R.id.btnAddToCart);
        viewHolder.lblItemsName=(TextView) convertView.findViewById(R.id.lblItemName);
        viewHolder.lblPrice = (TextView) convertView.findViewById(R.id.lblPrice);
        viewHolder.btnPlus=(ImageButton)convertView.findViewById(R.id.btnPlus);
        viewHolder.btnMinus=(ImageButton)convertView.findViewById(R.id.btnMinus);
        viewHolder.txtQuantity  =(EditText)convertView.findViewById(R.id.txtQuantity);

        convertView.setTag(viewHolder);



    } else {

       viewHolder = (ItemViewHolder) convertView.getTag();
    }




  viewHolder.txtQuantity.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) {

            externalArray.set(position,viewHolder.txtQuantity.getText().toString());

        }
    });



    viewHolder.btnAddToCart.setTag(convertView);
    viewHolder.btnPlus.setTag(convertView);
    viewHolder.btnMinus.setTag(convertView);

    viewHolder.lblItemsName.setText(items.getItemName());
    String p=items.getPrice().toString();
    viewHolder.lblPrice.setText(p+" $" );





   if (externalArray.get(position) == "")
            viewHolder.txtQuantity.setText("");
        else
            viewHolder.txtQuantity.setText(externalArray.get(position));



        viewHolder.btnAddToCart.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {



               _Quantity=viewHolder.txtQuantity.getText().toString();

                Quantity = new Double(Double.parseDouble(_Quantity));

                Double Total =Price*Quantity;



            }
        });




        return convertView;
    }


  public class ItemViewHolder {

    public EditText txtQuantity ;
    public Button btnAddToCart ;
    public   TextView lblItemsName;
   public  TextView lblPrice;

    }
}

3 个答案:

答案 0 :(得分:0)

这一行造成了麻烦

$(function() {
  $('.listing-content').click(function() {
  $(this).css('background-image', 'url(http://i.stack.imgur.com/Kg1Do.png)');
 });
})

您需要直接从viewholder获取EditText。 只需使用:

EditText   txtQuantity=(EditText)((View)v.getTag()).findViewById(R.id.txtQuantity);

您需要初始化viewHolder.txtQuantity.getText().toString() 以及其他观看者视图。

答案 1 :(得分:0)

这一切都是因为您的列表项目正在被回收,如果convertView不是null,那么它将通过convertView.getTag();进行回收。

为防止出现这种情况,您可以通过删除

来阻止回收convertView代码
  if (convertView == null) {

和匹配的else子句。

但之后你可能会遇到滚动滞后问题,所以我可以建议尝试优化你的列表项,这意味着尝试减少列表项的数量,因为它会导致高CPU消耗。

答案 2 :(得分:0)

您可以查看我的回答here。虽然问题不一样,但是这是一个类似的情况,你已经到了这里。

因此,在您的情况下,您可以通过多种方式解决问题。我可以建议你一个。您可能会保留一个外部数组,该数组最初将包含所有空字符串。数组大小需要等于RecyclerView的大小。在TextWatcher内添加EditText getView()。因此,当您在EditText字段中添加一些文本时,我们的想法是将文本存储在外部数组中。将文本放在数组的特定索引中,以跟踪列表中的哪个项目被修改。

现在使用getView()方法

if(externalArray[pos].equals("")) 
    txtQuantity.setText("");
else 
    txtQuantity.setText(externalArray[pos]);

是的,在您初始化列表项的其他视图的EditText之外声明onClickListener

因此,根据您更新的代码,我建议您进行一些修改

// Declare an String array
private String[] externalArray = new String[objects.size()];

现在您的TextChangedListener应该是这样的

viewHolder.txtQuantity.addTextChangedListener(new TextWatcher() {
  @Override
  public void onTextChanged(CharSequence s, int start, int before, int count) {
    externalArray[position] = viewHolder.txtQuantity.getText().toString();
  }

  @Override
  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    // Do nothing
  }

  @Override
  public void afterTextChanged(Editable s) {
    // Do nothing
  }
});

现在设置txtQuantity就像这样

//if (externalArray.get(position).equals(""))
//  viewHolder.txtQuantity.setText("");
//else
//  viewHolder.txtQuantity.setText(externalArray.get(position));

// OR you can put a single line. I added the else part
// to make you understand the scenario actually. 
viewHolder.txtQuantity.setText(externalArray.get(position));