从客户适配器的getView中的onclick侦听器访问特定视图

时间:2013-02-27 00:00:08

标签: java android android-listview custom-adapter

我希望onclick方法与布局中的其他视图进行通信。尝试这样做时,我收到NullPointerException。我想我可能做错了。

我的getView方法如下:

    public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    ViewHolder holder;
    final int p =position;
    if (v == null) {
       LayoutInflater vi = (LayoutInflater) _c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       v = vi.inflate(R.layout.menuitemrow, null);
       holder = new ViewHolder();
       holder.image = (ImageView) v.findViewById(R.id.MIR_itemImage);holder.image.setTag(position);
       holder.itemName = (TextView)v.findViewById(R.id.MIR_itemName);holder.itemName.setTag(position);
       holder.itemPrice = (TextView)v.findViewById(R.id.MIR_itemPrice);holder.itemPrice.setTag(position);
       holder.itemOther = (TextView)v.findViewById(R.id.MIR_itemOther);holder.itemOther.setTag(position);
       holder.details = (Button) v.findViewById(R.id.MIR_detailsbtn);holder.details.setTag(position);
       holder.qAdd = (Button) v.findViewById(R.id.MIR_qaddbtn);holder.qAdd.setTag(position);
       v.setTag(holder);
    } else 
        holder = (ViewHolder) v.getTag();
    MenuItemDetail mid = _data.get(position);
    holder.image.setImageResource(mid.icon);
    holder.itemName.setText(mid.itemName);
    holder.itemPrice.setText("Price: $"+mid.itemPrice);
    holder.itemOther.setText(mid.itemOther);
    //set click listeners
    holder.details.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            m =_data.get(p);
            s = m.getItemName();
            Toast.makeText(_c, "clicked details"+p+" "+s, Toast.LENGTH_SHORT).show();
        }
    });
    holder.qAdd.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(_c, "clicked quick add "+p, Toast.LENGTH_SHORT).show();
            TextView btnUpdate = (TextView) v.findViewById(R.id.CBV_textview2);
            //btnUpdate.setTag(1);
            //btnUpdate.setText(btnUpdate.getTag().toString());
            btnUpdate.setText("b");
        }
    });


    return v;
}

正如您所看到的,我只是为getTag分配一个号码,只是为了将其传递给setText方法。我已经尝试过使用String来评论集合并获取。

有问题的行是btnUpdate.setText("b");

有什么想法吗?

总结一下,我尝试从客户适配器的TextView方法访问自定义Button内的自定义ListView {/ 1}}。

更新评论:

这是与其他按钮一起显示的自定义列表视图。单击以更新我创建的自定义按钮的文本视图时,我想要listview项(自定义getView的一部分按钮),该自定义按钮与自定义列表视图显示的活动相同。

布局如下:

ListView

在我引用的视图中获取Textview,textview不在那里。该观点中的内容是<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/MI_backbutton" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_weight="1" android:text="@string/back_list_categories" android:textSize="@dimen/FontSize8" /> <ListView android:id="@+id/menuList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="20" > </ListView> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="bottom" android:layout_marginBottom="5dp" android:layout_weight="1" > <Button android:id="@+id/button2" style="@android:style/Widget.Button" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_gravity="bottom" android:layout_weight="1" android:text="@string/generalbutton" /> <include android:id="@+id/MI_checkorder" style="android:buttonStyle" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_gravity="bottom" android:layout_marginTop="5dp" android:layout_weight="1" layout="@layout/custombtnview" android:background="@style/AppTheme" android:clickable="true" android:focusable="true" /> </LinearLayout> 。我想也许这就是我为MI_checkorder获得NullPointerException的原因。 textveiw btnUpdate是我创建的视图的一部分(CBV_textview2)。

我现在有了按钮,但我无法在UI上显示更改。这是我添加的代码:

MI_checkorder

这是我在自定义适配器类中创建的方法。

            public void onClick(View v) {
            Toast.makeText(_c, "clicked quick add "+p, Toast.LENGTH_SHORT).show();
            TextView btnUpdate = (TextView) inflateToEdit(_c, v).findViewById(R.id.CBV_textview2);
            //btnUpdate.setTag(1);
            //btnUpdate.setText(btnUpdate.getTag().toString());
            btnUpdate.setText("b");
        }

它正在更新按钮的文本,但它没有在UI上显示。我不认为我可以在代码中从这一点更新UI。我想我需要从活动中做到这一点。

1 个答案:

答案 0 :(得分:2)

这是因为在视图上调用的 findViewById 会查找给定视图的子视图。

findViewById doc

“查找具有给定id的子视图。如果此视图具有给定的id,则返回此视图。”

从我所看到的,CBV_textview2包含在活动的布局中。 所以,你可以做的是将活动传递给适配器的构造函数(我看到你已经有一个_c成员变量,我认为它是一个Context,或者直接传递CBV_textview2本身(在包含的activty中调用findViewById)。

在这两种情况下,您都需要调用活动的findViewById “查找由onCreate(Bundle)中处理的XML中的id属性标识的视图。”

public class YourAdapter extends ArrayAdapter<String> {
  private final Context context;
  // blahblahblah
  private final TextView mYourTextView;

 public YourAdapter(Context context, String[] values, TextView btnUpdate) {
     super(context, R.layout.rowlayout, values);
     this.context = context;
     this.values = values;
     mYourTextView = btnUpdate;
 }

 ....

 @Override
    public void onClick(View v) {
        Toast.makeText(_c, "clicked quick add "+p, Toast.LENGTH_SHORT).show();
        //mYourTextView.setTag(1);
        //mYourTextView.setText(btnUpdate.getTag().toString());
        mYourTextView.setText("b");
    }

在您的活动中,您应该能够在调用构造函数之前获取TextView。