如何改变TextView的在列表项上点击按钮 [英] How to change textView in list item on Button click

查看:184
本文介绍了如何改变TextView的在列表项上点击按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想改变我的TextView的数量,以反映特定项目的数量。但在点击add和子键的的setText()函数似乎不工作。这里是我的适配器类

I want to change my quantity textview to reflect the quantity of a particular item. But on clicking the add and sub buttons, the setText() function does not seem to work. Here is my adapter class

public class ItemAdapter extends ArrayAdapter<String>{
    Context context;
    int[] images,rate,quant;
    String[] names;
    ImageButton add, sub;
    ViewHolder holder; // Since will be accessed inside onclick
    Integer count1=0;

    HashMap<String,Integer> positiveNumbers = new HashMap<String,Integer>();
    Integer count=0;

    static class ViewHolder { 
        public TextView textView;
        public ImageView imageView;
        public TextView number;
        public TextView rates;
        public String uniqueKey;

    } 

    public ItemAdapter(Context c, String[] items, int quantity[], int[] rate, int[] img) {
        // TODO Auto-generated constructor stub 
        super(c, R.layout.item_fooditems, R.id.tvitemname, items);
        this.context = c;
        this.images = img;
        this.names = items;
        this.rate=rate;
        this.quant=quantity;
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub 
        View row = convertView;
        // reuse views 

        if (row == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.item_fooditems, parent, false);
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.imageView = (ImageView) row.findViewById(R.id.ivimage);
            viewHolder.textView = (TextView) row.findViewById(R.id.tvitemname);
            viewHolder.number = (TextView)row.findViewById(R.id.tvquantity);
            viewHolder.rates = (TextView)row.findViewById(R.id.tvprice);
            viewHolder.uniqueKey = String.valueOf(position);
            add = (ImageButton) row.findViewById(R.id.bincrement);
            add.setTag(position);
            sub = (ImageButton) row.findViewById(R.id.bdecrement);
            sub.setTag(position);
            row.setTag(viewHolder);

        } 
        holder = (ViewHolder) row.getTag();  //keeping one global memory
        holder.imageView.setImageResource(images[position]);
        holder.textView.setText(names[position]);
        holder.rates.setText(Integer.toString(rate[position]));
        holder.number.setText(Integer.toString(quant[position]));
        holder.number.setText("x");
        add.setOnClickListener(new OnClickListener() {
            @Override 
            public void onClick(View v) {
                // TODO Auto-generated method stub  
                quant[position]=quant[position]+1;
                count1 +=1;
                //holder.number.setText(Integer.toString(quant[position]));
                holder.number.setText(count1.toString());
                Toast.makeText(context, Integer.toString(quant[position]), Toast.LENGTH_SHORT).show();
                Log.d("Quantity",Integer.toString(quant[position]));
                positiveNumbers.put(holder.uniqueKey,count); //Key -> String.valueOf(position) and Value -> int count
            } 
        }); 

        sub.setOnClickListener(new OnClickListener() {
            @Override 
            public void onClick(View v) {
                // TODO Auto-generated method stub 
                quant[position]--;
                Toast.makeText(context, Integer.toString(quant[position]), Toast.LENGTH_SHORT).show();
                holder.number.setText(Integer.toString(quant[position]));
                positiveNumbers.put(holder.uniqueKey,count);   //Key -> String.valueOf(position) and Value -> int count
            } 
        }); 

        return row;
    } 


     public HashMap<String, Integer> getPositiveNumbers()
     {
       return positiveNumbers;
     }


}

需要什么样的修改?

What modifications are required?

推荐答案

所有,而不是采取这些单个阵列首先,你应该简单地做一个自定义模式类所有你需要的值。例如,在你的情况,这将是这样的。

First of all instead of taking these individual arrays, you should simply make a custom modal class with all the values you need. For example in your case, it will be something like this.

    public class Item {

    private String itemName = "";
    private int quantity;
    private int rate;
    private int image;

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int getRate() {
        return rate;
    }

    public void setRate(int rate) {
        this.rate = rate;
    }

    public int getImage() {
        return image;
    }

    public void setImage(int image) {
        this.image = image;
    }
}

和现在把这个模式类你适配器constructor.And这是如何您可以在getView设定值()

And now pass this modal class to you adapter constructor.And this is how you can set value in your getView()

    Item item=itemList.get(position); //here itemList is the list you are passing to your adapter.
    holder.imageView.setImageResource(item.getImage());
    holder.textView.setText(item.getItemName());
    holder.rates.setText(String.valueOf(item.getRate()));
    holder.number.setText(String.valueOf(item.getQuantity()));

现在来到你的添加/次的点击监听器,没有必要设置数量的TextView的文本中添加/次的点击监听器。您可以为ITEMLIST相应的指数更新量的值后,简单地通知您的适配器。对于如。对于加量,你可以做这样的事情。

Now coming to your add/sub click listener,there is no need to set text of your quantity TextView inside add/sub click listener. You can simply notify your adapter after updating the value of quantity at corresponding index for the itemList. For eg. for add quantity you can do something like this.

add.setOnClickListener(new OnClickListener() {
        @Override 
        public void onClick(View v) {
            Item item=itemList.get(position);// getting the item at particular position
            item.setQuantity(item.getQuantity()+1);// incrementing item quantity by 1
            itemList.set(position,item);// updating the itemList to that new item with incremented quantity
            notifyDataSetChanged();//notifying the adapter
        } 
    }); 

同样可以为你减量onClickListener做()。

Same you can do for the your subtract quantity onClickListener().

sub.setOnClickListener(new OnClickListener() {
        @Override 
        public void onClick(View v) {
            Item item=itemList.get(position);//getting the item at particular position
            item.setQuantity(item.getQuantity()-1);//decrementing item quantity by 1
            itemList.set(position,item);// updating the itemList to that new item with decremented quantity
            notifyDataSetChanged();//notifying the adapter
        } 
    }); 

这肯定会工作。此外,它是一个很好的做法,以保持一个列表,而不是与ListView控件/ RecyclerView自定义适配器打交道时,有多个阵列。

This will surely work. Also it is a good practice to maintain a single list instead of having multiple arrays when dealing with custom adapters for ListView/RecyclerView.

这篇关于如何改变TextView的在列表项上点击按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆