Button 带两个按钮的listView(Android)

Button 带两个按钮的listView(Android),button,android-listview,Button,Android Listview,我对ListView有一个大问题。我在每个listView的行中有2个按钮,btPlus和btMinus(以及4个文本视图)。这两个按钮增加(btPlus)和减少(btPlus)标签lblQty的值。 我创建了一个自定义ArrayAdapter,设置方式如下: public class ProductsViewAdapter extends ArrayAdapter<HashMap<String, String>>{ private int resource; priva

我对ListView有一个大问题。我在每个listView的行中有2个按钮,btPlus和btMinus(以及4个文本视图)。这两个按钮增加(btPlus)和减少(btPlus)标签lblQty的值。 我创建了一个自定义ArrayAdapter,设置方式如下:

public class ProductsViewAdapter extends ArrayAdapter<HashMap<String, String>>{
private int resource;
private LayoutInflater inflater;
private char tag;
private Context context;

private ArrayList<HashMap<String, String>> prodotti;
private HashMap<String, String> prodotto;

RowHolder holder;

public ProductsViewAdapter(Context context, int resourceId,
        ArrayList<HashMap<String, String>> objects, char t) {
          super(context, resourceId, objects);
          this.resource = resourceId;
          this.context = context;
          this.prodotti = objects;
          this.tag = t;
         }

 @Override
public View getView(int position, View convertView, ViewGroup parent) {
  View row = convertView;
  holder = null;

  if (row == null) {
       LayoutInflater inflater = ((Activity) context).getLayoutInflater();
       row = inflater.inflate(resource, parent, false);
       holder = new RowHolder();
       holder.tvPid = (TextView) row.findViewById(R.id.pid);
       holder.tvNome = (TextView) row.findViewById(R.id.name);
       holder.tvDescr = (TextView) row.findViewById(R.id.description);
       holder.tvPrezzo = (TextView) row.findViewById(R.id.price);
       holder.btPlus = (Button) row.findViewById(R.id.btnPlus);
       holder.btMinus = (Button) row.findViewById(R.id.btnMinus);
       holder.tvQuantita = (TextView) row.findViewById(R.id.lblQty);
       row.setTag(holder);
  } 
  else {
       holder = (RowHolder) row.getTag();
  }
  prodotto = prodotti.get(position);
  if (tag == 'p'){
      holder.tvPid.setText(prodotto.get("idProdotto"));  
  }
  else {
      holder.tvPid.setText(prodotto.get("idBibita"));
  }

  holder.tvNome.setText(prodotto.get("nome"));
  holder.tvDescr.setText(prodotto.get("descrizione"));
  holder.tvPrezzo.setText(prodotto.get("prezzo"));
  holder.btPlus.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
        // TODO Auto-generated method stub
        Log.i("Plus Button Clicked", "**********");
        Toast.makeText(context, "Plus button Clicked",
          Toast.LENGTH_LONG).show();
        int val = Integer.parseInt(holder.tvQuantita.getText().toString())+1;
        holder.tvQuantita.setText(String.valueOf(val));
       }
  });

  holder.btMinus.setOnClickListener(new OnClickListener() {

       @Override
       public void onClick(View v) {
        // TODO Auto-generated method stub
        Log.i("Minus Button Clicked", "**********");
        Toast.makeText(context, "Minus button Clicked",
          Toast.LENGTH_LONG).show();
        int val = Integer.parseInt(holder.tvQuantita.getText().toString());
        if (val > 0 ){
            val--;
            holder.tvQuantita.setText(String.valueOf(val));
        }
       }
  });
  return row;
 }

 static class RowHolder {
      TextView tvPid;
      TextView tvNome;
      TextView tvDescr;
      TextView tvPrezzo;
      TextView tvQuantita;
      Button btPlus;
      Button btMinus;
 }
}
public类产品viewadapter扩展了ArrayAdapter{
私有int资源;
私人充气机;
私有字符标签;
私人语境;
私人ArrayList prodotti;
私有HashMap prodotto;
持行人;
public ProductsViewAdapter(上下文,int-resourceId,
ArrayList对象,字符(t){
超级(上下文、资源ID、对象);
this.resource=resourceId;
this.context=上下文;
this.prodotti=对象;
this.tag=t;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
holder=null;
if(行==null){
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(资源,父项,false);
holder=新的行holder();
holder.tvPid=(TextView)row.findViewById(R.id.pid);
holder.tvNome=(TextView)row.findViewById(R.id.name);
holder.tvDescr=(TextView)row.findViewById(R.id.description);
holder.tvPrezzo=(TextView)row.findViewById(R.id.price);
holder.btPlus=(按钮)row.findViewById(R.id.btnPlus);
holder.bt减号=(按钮)行.findViewById(R.id.btnMinus);
holder.tvQuantita=(TextView)row.findViewById(R.id.lblQty);
row.setTag(支架);
} 
否则{
holder=(RowHolder)row.getTag();
}
prodotto=prodotti.get(位置);
如果(标记=='p'){
holder.tvPid.setText(prodotto.get(“idProdotto”);
}
否则{
holder.tvPid.setText(prodotto.get(“idBibita”);
}
holder.tvNome.setText(prodotto.get(“nome”);
holder.tvDescr.setText(prodotto.get(“descripione”);
holder.tvPrezzo.setText(prodotto.get(“prezzo”);
holder.btPlus.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
Log.i(“点击加号按钮”,“*******”);
Toast.makeText(上下文,“单击加号按钮”,
Toast.LENGTH_LONG).show();
int val=Integer.parseInt(holder.tvQuantita.getText().toString())+1;
holder.tvQuantita.setText(String.valueOf(val));
}
});
holder.btemission.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
Log.i(“点击减号按钮”,“*******”);
Toast.makeText(上下文,“单击减号按钮”,
Toast.LENGTH_LONG).show();
int val=Integer.parseInt(holder.tvQuantita.getText().toString());
如果(val>0){
瓦尔--;
holder.tvQuantita.setText(String.valueOf(val));
}
}
});
返回行;
}
静态类行保持器{
文本视图tvPid;
TextView-tvNome;
文本视图tvDescr;
TextView-tvPrezzo;
TextView-tvQuantita;
按钮btPlus;
按钮BT减号;
}
}
所以我在活动中使用它:

ProductsViewAdapter adapter = new ProductsViewAdapter(
            AllProducts_View.this, R.layout.list_item_from_cat, productsList, 'p'
            );
            /*AllProducts_View.this, productsList,
            R.layout.list_item_from_cat, new String[] { TAG_PID,
                    TAG_NAME, TAG_DESCRIZIONE, TAG_PREZZO},
            new int[] { R.id.pid, R.id.name, R.id.description, R.id.price});*/
    // updating listview
    lv.setItemsCanFocus(false);
    lv.setAdapter(adapter);
    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                HashMap<String, String> p = (HashMap<String, String>) parent.getItemAtPosition(position);
                Toast.makeText(
                                view.getContext(),
                                "Click sulla riga " + p.get("nome") + " " + p.get("prezzo"),
                                Toast.LENGTH_LONG
                                ).show();
        }
    });
ProductsViewAdapter适配器=新产品sviewadapter(
AllProducts\u View.this,R.layout.list\u item\u from\u cat,productsList,'p'
);
/*AllProducts\u View.this,productsList,
R.layout.list_item_from_cat,新字符串[]{TAG_PID,
标签名称,标签说明,标签说明,
新的int[]{R.id.pid,R.id.name,R.id.description,R.id.price})*/
//更新列表视图
lv.setItemsCanFocus(假);
低压设置适配器(适配器);
lv.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
HashMap p=(HashMap)parent.getItemAtPosition(位置);
Toast.makeText(
view.getContext(),
“单击sulla riga”+p.get(“nome”)+“+p.get”(“prezzo”),
吐司,长度
).show();
}
});
这里是单行的xml代码(来自\u cat.xml的列表\u item\u):


我的问题是,当我单击每行中的按钮时,它们会增加或减少另一行的值。甚至当我用一个可变的结果滑动listView时,这种情况也会发生

有人能帮我吗


非常感谢您的回答

这是很古老的,我想您已经找到了答案,但以防万一。。。 看起来你所看到的是细胞回收器运行的结果。您正在直接设置textview的值,这意味着每第n行都会受到更新的影响。 例如,假设列表视图显示第0、1、2和3行。如果我理解您的意思,您将添加到第0行,然后当您开始滚动时,第4行也已更改。同样,如果你向下滚动到7,它也会随之改变,此后每4项都会改变一次

您可以通过在与列表关联的对象中设置新数量值,然后从该对象设置文本字段来解决此问题。而不是:

int val = Integer.parseInt(holder.tvQuantita.getText().toString())+1;
holder.tvQuantita.setText(String.valueOf(val));
做:

从代码的外观来看,您可能需要进行一些重构才能达到目标,但这应该不会太糟糕。你有一个HashMap。您可以将其重构为

HashMap<String, CompoundObject> 
然后,您就可以在不更改所有数量的情况下设置新值。 最后,您需要在设置名称、描述和价格的每个getView上设置该对象的值

holder.tvNome.setText(prodotto.get("nome"));
holder.tvDescr.setText(prodotto.get("descrizione"));
holder.tvPrezzo.setText(prodotto.get("prezzo"));
holder.tvQuantita.setText(/*set quantity here*/);
holder.btPlus.setOnClickListener(new OnClickListener() {
这将使您的列表视图不会重复

HashMap<String, CompoundObject> 
public class Container {
    private String currentString;
    private int quantity;
    //don't forget getters and setters, and maybe equals/hashCode
}
holder.tvNome.setText(prodotto.get("nome"));
holder.tvDescr.setText(prodotto.get("descrizione"));
holder.tvPrezzo.setText(prodotto.get("prezzo"));
holder.tvQuantita.setText(/*set quantity here*/);
holder.btPlus.setOnClickListener(new OnClickListener() {