在按钮单击如何递增计数器,并显示在TextView中 [英] On Button Click how to increment counter and show in textview

查看:624
本文介绍了在按钮单击如何递增计数器,并显示在TextView中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的一个购物车分配,我已经创建了一个包含图片,价格并添加到购物车按钮,每行中一个自定义的ListView。 我也有一个TextView顶部它每次递增,用户presses添加到购物车。 每一行中的按钮是完全工作正常,但我不知道如何增加计数器并将其设置为TextView的是,每当我这样做是在onClick事件,我得到运行时错误。 我与你分享的code。

 包uet.cs08.bll;

进口的java.util.ArrayList;

进口uet.cs08.android.R;
进口uet.cs08.android.mainActivity2;
进口android.content.Context;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.BaseAdapter;
进口android.widget.Button;
进口android.widget.ImageView;
进口android.widget.TextView;

公共类itemBaseAdapter扩展了BaseAdapter {

 公众诠释计数= 5;
 私人的ArrayList< ItemInfo> ITEMLIST;
 私人LayoutInflater mInflater;

 公共itemBaseAdapter(上下文的背景下,ArrayList的< ItemInfo> ITEMLIST){
     this.itemList = ITEMLIST;
     mInflater = LayoutInflater.from(上下文);

 }
@覆盖
公众诠释getCount将(){
    返回itemList.size();

}

@覆盖
公共对象的getItem(INT IDX){
     返回itemList.get(IDX);
}

@覆盖
众长getItemId(INT IDX){
    // TODO自动生成方法存根
    返回IDX;
}

@覆盖
公共查看getView(INT IDX,查看convertView,ViewGroup中父){
    最后ViewHolder持有人;
    如果(convertView == NULL){

        convertView = mInflater.inflate(R.layout.item_list_row,NULL);
        持有人=新ViewHolder();
        holder.txtItemName =(TextView中)convertView.findViewById(R.id.itemName);
        holder.txtPic =(ImageView的)convertView.findViewById(R.id.pic);
        holder.txtPrice =(TextView中)convertView.findViewById(R.id.price);
        holder.counter =(TextView中)convertView.findViewById(R.id.tvCount);
        按钮BTN =(按钮)convertView.findViewById(R.id.C​​art);
        最后的TextView电视=(TextView中)convertView.findViewById(R.id.tvCount);


        btn.setOnClickListener(新View.OnClickListener(){
        @覆盖
            公共无效的onClick(视图v){

                 数=的Integer.parseInt((字符串)tv.getText());
                 算上++;
                 tv.setText(+计);


        }
        });
            //tv.setText(""+count);
            convertView.setTag(保持器);
    }其他
    {
           支架=(ViewHolder)convertView.getTag();
    }

    holder.txtItemName.setText(itemList.get(IDX).itemName);
    holder.txtPic.setImageResource(itemList.get(IDX).PIC);
    holder.txtPrice.setText(+ itemList.get(IDX)。价格);
    holder.counter.setText(itemList.get(IDX).Count之间);

    返回convertView;
}


类ViewHolder {
      TextView的txtItemName;
      ImageView的txtPic;
      TextView的txtPrice;
      TextView的计数器;
     }
 

} ` 下面是logcat中。

  03-20 16:16:38.853:D / AndroidRuntime(2759):关闭虚拟机
03-20 16:16:38.853:W / dalvikvm(2759):主题ID = 1:螺纹退出与未捕获的异常(组= 0x40015560)
03-20 16:16:38.883:E / AndroidRuntime(2759):致命异常:主要
03-20 16:16:38.883:E / AndroidRuntime(2759):显示java.lang.NullPointerException
03-20 16:16:38.883:E / AndroidRuntime(2759):在uet.cs08.bll.itemBaseAdapter $ 1.onClick(itemBaseAdapter.java:61)
03-20 16:16:38.883:E / AndroidRuntime(2759):在android.view.View.performClick(View.java:2485)
03-20 16:16:38.883:E / AndroidRuntime(2759):在android.view.View $ PerformClick.run(View.java:9080)
03-20 16:16:38.883:E / AndroidRuntime(2759):在android.os.Handler.handleCallback(Handler.java:587)
03-20 16:16:38.883:E / AndroidRuntime(2759):在android.os.Handler.dispatchMessage(Handler.java:92)
03-20 16:16:38.883:E / AndroidRuntime(2759):在android.os.Looper.loop(Looper.java:123)
03-20 16:16:38.883:E / AndroidRuntime(2759):在android.app.ActivityThread.main(ActivityThread.java:3683)
03-20 16:16:38.883:E / AndroidRuntime(2759):在java.lang.reflect.Method.invokeNative(本机方法)
03-20 16:16:38.883:E / AndroidRuntime(2759):在java.lang.reflect.Method.invoke(Method.java:507)
03-20 16:16:38.883:E / AndroidRuntime(2759):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
03-20 16:16:38.883:E / AndroidRuntime(2759):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-20 16:16:38.883:E / AndroidRuntime(2759):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

请确保您有参考XML你的TextView。

连接它(使用 findViewById())内的onCreate() 活动的只,你可能把它传递给你的适配器(即制造类的字段和setter的getter方法​​),如果适配器是一个独立的类。

和不做这里面的 getView()适配器,删除此行。

 最后的TextView电视=(TextView中)convertView.findViewById(R.id.tvCount);
 

您会通过你的的TextView 活动适配器使用构造函数或setter的getter方法​​,将保持一个参考使用类适配器的类级别的变量和你会做内部的的onClick()按钮的>是:

  btn.setOnClickListener(新View.OnClickListener(){
     @覆盖
     公共无效的onClick(视图v){
          算上++;
         yourClassLevelTextView.setText(将String.valueOf(计数));
     }});
 

编辑:

你将如何传递的TextView到适配器

 公共类YourAdapter扩展BlahBlahBlah
{
     私人TextView的yourClassLevelTextView;
     公共无效setTextView(TextView的textViewFromActivity)
     {
         this.yourClassLevelTextView = textViewFromActivity;
     }
}
 

活动做这样的事情:

  YourAdapter适配器=新YourAdapter(等等,等等,等等);
adapter.setTextView(yourTextViewInActivity);
listView.setAdapter(适配器);
 

I am working on a shopping cart assignment for that I have created a custom ListView that contains the Picture, Price and Add to Cart button in each row. I also have a textview at the top which increments everytime the user presses the Add to cart. The Button in every row is perfectly working fine but I don't know how to increment the counter and set it to the textview as whenever I do this under onClick event I get runtime error. I am sharing with you the code.

package uet.cs08.bll;

import java.util.ArrayList;

import uet.cs08.android.R;
import uet.cs08.android.mainActivity2;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class itemBaseAdapter extends BaseAdapter  {

 public int count = 5;
 private ArrayList<ItemInfo> itemList;
 private LayoutInflater mInflater;

 public itemBaseAdapter(Context context, ArrayList<ItemInfo> itemList){
     this.itemList=itemList;
     mInflater= LayoutInflater.from(context);

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

}

@Override
public Object getItem(int idx) {
     return itemList.get(idx);
}

@Override
public long getItemId(int idx) {
    // TODO Auto-generated method stub
    return idx;
}

@Override
public View getView(int idx,  View convertView, ViewGroup parent) {
    final ViewHolder holder;
    if(convertView==null){

        convertView=mInflater.inflate(R.layout.item_list_row, null);
        holder = new ViewHolder();
        holder.txtItemName=(TextView)  convertView.findViewById(R.id.itemName);
        holder.txtPic=(ImageView) convertView.findViewById(R.id.pic);
        holder.txtPrice=(TextView) convertView.findViewById(R.id.price);
        holder.counter = (TextView) convertView.findViewById(R.id.tvCount);
        Button btn = (Button) convertView.findViewById(R.id.Cart);
        final TextView tv = (TextView)convertView.findViewById(R.id.tvCount);


        btn.setOnClickListener(new View.OnClickListener() {
        @Override
            public void onClick(View v) {

                 count = Integer.parseInt((String)tv.getText());
                 count++;
                 tv.setText("" + count);


        }
        });
            //tv.setText(""+count);         
            convertView.setTag(holder);
    }else
    {
           holder = (ViewHolder) convertView.getTag();
    }

    holder.txtItemName.setText(itemList.get(idx).itemName);
    holder.txtPic.setImageResource(itemList.get(idx).pic);
    holder.txtPrice.setText(""+itemList.get(idx).price);
    holder.counter.setText(itemList.get(idx).count);

    return convertView;
}


class ViewHolder {
      TextView txtItemName;
      ImageView txtPic;
      TextView txtPrice;
      TextView counter;
     }

} ` Here is the logCat.

03-20 16:16:38.853: D/AndroidRuntime(2759): Shutting down VM
03-20 16:16:38.853: W/dalvikvm(2759): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-20 16:16:38.883: E/AndroidRuntime(2759): FATAL EXCEPTION: main
03-20 16:16:38.883: E/AndroidRuntime(2759): java.lang.NullPointerException
03-20 16:16:38.883: E/AndroidRuntime(2759):     at uet.cs08.bll.itemBaseAdapter$1.onClick(itemBaseAdapter.java:61)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at android.view.View.performClick(View.java:2485)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at android.view.View$PerformClick.run(View.java:9080)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at android.os.Handler.handleCallback(Handler.java:587)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at android.os.Looper.loop(Looper.java:123)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at android.app.ActivityThread.main(ActivityThread.java:3683)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at java.lang.reflect.Method.invokeNative(Native Method)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at java.lang.reflect.Method.invoke(Method.java:507)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-20 16:16:38.883: E/AndroidRuntime(2759):     at dalvik.system.NativeStart.main(Native Method)

解决方案

Make sure you have reference to your TextView in xml.

Connect it (using findViewById()) inside onCreate() of Activity only, and you may pass it to your Adapter (i.e making a class field and setter getter method), if Adapter is a separate class.

and dont do this inside getView() of Adapter, remove this line.

final TextView tv  = (TextView)convertView.findViewById(R.id.tvCount);

you will pass your TextView from Activity to Adapter using constructor or setter getter method, will keep a reference using class Adapter's class level variable and the what you will do inside onClick() of Button is:

btn.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
          count++;
         yourClassLevelTextView.setText(String.valueOf(count));
     }});

EDIT:

how you will pass TextView to Adapter

public class YourAdapter extends BlahBlahBlah
{
     private TextView yourClassLevelTextView;
     public void setTextView(TextView textViewFromActivity)
     {
         this.yourClassLevelTextView = textViewFromActivity;
     }
}

and in Activity do something like this:

YourAdapter adapter = new YourAdapter(blah, blah, blah);
adapter.setTextView(yourTextViewInActivity);
listView.setAdapter(adapter);

这篇关于在按钮单击如何递增计数器,并显示在TextView中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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