我有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;
}
}
答案 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));