在按钮单击如何递增计数器,并显示在TextView中单击、计数器、按钮、TextView

2023-09-12 05:35:49 作者:γǔ尒相关+1

我工作的一个购物车分配,我已经创建了一个包含图片,价格并添加到购物车按钮,每行中一个自定义的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(本机方法)
 

解决方案 Photoshop设计自己的个性风格网站计数器图片 二

请确保您有参考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);