当用户更改数字选择器小部件中的值时,我正在尝试更新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
}
Toast消息被用于测试监听器是否正常工作,它是。然后我添加了setText()方法,但这导致了错误。
对此问题的任何帮助将不胜感激!我将MenuView声明在MenuItemArrayAdapter类的顶部:
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;
}
答案 0 :(得分:2)
price
的每一行都有TextView ListView
吗?
我想答案是肯定的,就像你在屏幕上只有一个TextView就可以显示总价格。
如果我的假设是正确的,那么你就不能在price
getView()
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
进行更新。