尝试使用数字选择器更新TextView

时间:2013-01-06 19:57:35

标签: android textview settext numberpicker

当用户更改数字选择器小部件中的值时,我正在尝试更新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;

}

1 个答案:

答案 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进行更新。