gpt4 book ai didi

java - 从客户适配器的 getView 中的 onclick 监听器访问特定 View

转载 作者:行者123 更新时间:2023-11-29 21:48:27 26 4
gpt4 key购买 nike

我希望 onclick 方法与布局中的其他 View 进行通信。尝试这样做时我收到 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 注释掉 set 和 get。

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

有什么想法吗?

总而言之,我正在尝试从其客户适配器的 getView 访问自定义 ListView 中自定义 ButtonTextView 方法。

评论更新:

这是一个与其他按钮一起显示的自定义 ListView 。我想要 listview 项(属于自定义 ListView 一部分的按钮),当它被单击以更新我创建的自定义按钮的 TextView 时,该按钮显示在与自定义 ListView 相同的 Activity 中。

布局如下:

<?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>

在我引用以获取 Textview 的 View 中,textview 不存在。该 View 中的内容是 MI_checkorder。我在想,也许这就是为什么我的 btnUpdate 得到了 NullPointerException。 textveiw CBV_textview2 是我作为按钮 (MI_checkorder) 创建的 View 的一部分。

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

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

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

    public View inflateToEdit(Context c, View view){
View vw = view;
LayoutInflater vi = (LayoutInflater) _c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return vi.inflate(R.layout.custombtnview, null);
}

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

最佳答案

那是因为调用 View 的findViewById 查找给定 View 的 subview 。

findViewById doc

“查找具有给定 ID 的 subview 。如果此 View 具有给定 ID,则返回此 View 。”

据我所知,CBV_textview2 包含在 Activity 的布局中。因此,您可以做的是将 Activity 传递给适配器的构造函数(我看到您已经有一个 _c 成员变量,我认为它是一个上下文,或者直接传递 CBV_textview2 本身(在包含的 Activity 中调用 findViewById)。

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

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

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

关于java - 从客户适配器的 getView 中的 onclick 监听器访问特定 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15101820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com