0

当用户更改数字选择器小部件内的值时,我正在尝试更新 TextView 中显示的值。

我设置了号码选择器并正常工作,但是当我尝试调用 TextView 的 .setText() 方法时,出现以下错误:

com.example.waitron5.MenuItemArrayAdapter.onValueChange 处的 java.lang.NullPointerException(MenuItemArrayAdapter.java:68)

下面是与 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
}

放入 Toast 消息以测试侦听器是否正常工作,并且确实如此。然后我添加了 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

TextViewprice在 的每一行中是否可用ListView
我想答案是否定的,就像屏幕上只有一个 TextView 应该显示总价一样。

如果我的假设是正确的,那么您就不应该实例pricegetView()

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

因为price将在R.layout.menuitem_row布局中搜索。如果 TextView 不存在,当您尝试使用时会抛出 NullPointer。

解决方案是在声明主布局的 onCreate() 中实例化price,然后将其作为参数传递给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 回答