1

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内のカスタムにアクセスしようとしています。ListViewgetView

コメントの更新:

これは、他のボタンとともに表示されるカスタムリストビューです。ListViewカスタムリストビューと同じアクティビティで表示される、作成したカスタムボタンのテキストビューを更新するためにクリックしたときに、リストビューアイテム(カスタムの一部であるボタン)が必要です。

レイアウトは以下のとおりです。

<?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を取得するために参照しているビューでは、textviewがありません。そのビューにあるのはMI_checkorderです。私は多分これが私が私のNullPointerExceptionために得ている理由だと思っていましたbtnUpdate。textveiwCBV_textview2は、button(MI_checkorder)として作成したビューの一部です。

ボタンはありますが、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を更新できるとは思いません。活動からやらなきゃいけないと思います。

4

1 に答える 1

2

これは、ビューで呼び出されたfindViewByIdが、指定されたビューの子ビューを検索するためです。

findViewByIdドキュメント

「指定されたIDを持つ子ビューを探します。このビューに指定されたIDがある場合は、このビューを返します。」

私が見ることができることから、CBV_textview2はアクティビティのレイアウトに含まれています。したがって、できることは、アクティビティをアダプタのコンストラクタに渡すことです(Contextであると思われる_cメンバー変数がすでにあるか、CBV_textview2自体を直接渡します(含まれているアクティビティで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を取得できるはずです。

于 2013-02-27T01:38:42.393 に答える