【问题标题】:On Button Click how to increment counter and show in textview在按钮上单击如何增加计数器并在 textview 中显示
【发布时间】:2012-03-20 11:04:00
【问题描述】:

我正在处理购物车分配,为此我创建了一个自定义 ListView,其中包含每行中的图片、价格和添加到购物车按钮。 我在顶部还有一个文本视图,每次用户按下“添加到购物车”时它都会增加。 每行中的按钮都可以正常工作,但我不知道如何增加计数器并将其设置为 textview,因为每当我在 onClick 事件下执行此操作时都会出现运行时错误。 我与您分享代码。

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;
     }

} ` 这是 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)

【问题讨论】:

  • 当你有错误时,总是在这里发布完整的logcat,以后不要忘记
  • 你有单个TextView 在顶部或每一行显示计数器吗?
  • 它在顶部。我的意思是它不会在每一行中重复,但按钮在每一行中,点击我想增加计数器。

标签: android android-layout android-activity


【解决方案1】:

确保您在 xml 中引用了您的 TextView。

仅在ActivityonCreate() 内连接它(使用findViewById()),如果Adapter 是单独的类。

并且不要在适配器的getView() 内执行此操作,删除此行。

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

您将使用构造函数或setter getter方法将TextViewActivity传递给Adapter,将使用Adapter's类级别变量以及您将在@987654333的onClick()中执行的操作保持引用@是:

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

编辑:

如何将 TextView 传递给适配器

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

Activity 中做这样的事情:

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

【讨论】:

  • 在 oncreate 函数的 MainActivity 类下我现在正在访问它,但我很困惑如何设置获取它并在其他类中访问它。
【解决方案2】:

您的 tv TextView 不在列表行布局中(您现在在其中搜索它)。如果您在活动布局中声明它(或在您声明它的布局中),则必须在活动布局中查找它:

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

【讨论】:

    【解决方案3】:

    嗨,我猜你代码中的 count textview 不属于持有者,count text view 也应该通过持有者显示

    【讨论】:

    • 我已经尝试过了,但它不起作用,在同一行出现同样的错误。
    • 我认为您在 if(convertview==null) 块中提供了按钮 onclick 侦听器,为什么您不能检查 onclicklistener 而不考虑 if 和 else 在该 convertview 位置仅 findviewbyid。您可以放置​​整个代码我会检查
    • 您好,我已经编辑了问题,现在整个代码都在那里。请看一下谢谢,
    【解决方案4】:

    我们必须设置该控件的 runOnUiThread 值。像这样..希望对您有所帮助。

    btn.setOnClickListener(new View.OnClickListener() 
    {
    
                @Override
                public void onClick(View v) {
                        count++;
                       setTimertext(count);
    
            }
            });
    
    public void setTimertext(String strValue) {         
            runOnUiThread(new Runnable() {
                public void run() {
    
                    txt.setText(String.valueOf(strValue));    
                }
            });
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2012-10-30
      相关资源
      最近更新 更多