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