0

ユーザーが番号ピッカーウィジェット内の値を変更したときに、TextViewに表示される値を更新しようとしています。

番号ピッカーを設定して正しく機能していますが、TextViewの.setText()メソッドを呼び出そうとすると、次のエラーが発生します。

com.example.waitron5.MenuItemArrayAdapter.onValueChange(MenuItemArrayAdapter.java:68)でのjava.lang.NullPointerException

以下は、MenuItemArrayAdapterクラスでエラーが発生していると思われる場所に対応するコードです。

@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
    Toast.makeText(this.getContext(), "Change: " + picker.getValue(), Toast.LENGTH_SHORT).show();
    //if oldVal > newVal increment price
    price.setText("xyz");
    //if oldVal < newVal decrement price
}

トーストメッセージは、リスナーが正しく機能していることをテストするために入力されました。次に、setText()メソッドを追加しましたが、エラーが発生しました。

この問題に関する助けをいただければ幸いです。MenuItemArrayAdapterクラスの先頭でTextViewを宣言します。

private TextView price;

注:番号ピッカーは、リストの各ビューに含まれています。これが、MenuItemAdapterクラスがある理由です。問題は、間違った場所からtextViewを更新しようとしたことに関連している可能性がありますか?

以下は、MenuItemAdapterクラスのgetView()メソッドです。

public View getView(final int position, View convertView, ViewGroup parent){
    View v = convertView;

    if(v == null){
        LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.menuitem_row, null);
    }

    //assign values to view
    MenuItem item = this.menuItems.get(position);

    TextView nameView = (TextView) v.findViewById(R.id.item_name);
    TextView priceView = (TextView) v.findViewById(R.id.item_price);

    nameView.setText(item.getName() + " ");
    priceView.setText("€"+ String.valueOf(item.getPrice()));

    price = (TextView)v.findViewById(R.id.price);

    //number picker
    np = (NumberPicker)v.findViewById(R.id.numpick);
    np.setMaxValue(99);
    np.setMinValue(0);
    np.setValue(0);

    np.setOnValueChangedListener(this);

    return v;

}
4

1 に答える 1

2

TextViewは?priceの各行で使用できますListViewか?
画面に合計金額を表示するTextViewが1つしかないように、答えはノーだと思います。

私の仮定が正しければ、あなたはでインスタンス化するべきではありませpricegetView()

price = (TextView)v.findViewById(R.id.price);

priceレイアウトで検索されますR.layout.menuitem_row。TextViewが存在しない場合、使用しようとするとNullPointerがスローされます。

price解決策は、メインレイアウトが宣言されているonCreate()でインスタンス化し、それをパラメーターとしてに渡すことMenuItemArrayAdapterです。

このようなもの:

// ....
TextView price = (TextView)findViewById(R.id.price);
adapter = new MenuItemArrayAdapter(this, price); 
this.setAdapter(adapter)
//....

次に、のコンストラクターを変更してMenuItemArrayAdapter、TextViewを受け入れます。

public MenuItemArrayAdapter(Context context, TextView price){
  this.context = context;
  this.price=price
}

その後、安全priceに使用して更新できます。

于 2013-01-06T20:22:15.483 に答える