I have a ListView
activity that has a NumberPicker
view on each item in the list. The user can use this picker to add/remove items. It is working however the issue I have is that when I resume the ListView
activity the values are still at the chosen values when I would like them to be set to 0.
Is there any way I can do this?
So far I have done the following inside my MenuItemArrayAdapter
class I add a method to reset the number picker.
public class MenuItemArrayAdapter extends ArrayAdapter<MenuItem>{
private List<MenuItem> menuItems;
private List<MenuItem> order;
private static NumberPicker np;
private TextView price;
private double amount = 0.0;
private double total = 0.0;
//Constructor
public MenuItemArrayAdapter(Context context, List<MenuItem> menuItems, TextView price) {
super(context, R.layout.menuitem_row, menuItems);
this.menuItems = menuItems;
this.price = price;
order = new ArrayList<MenuItem>();
}
public MenuItemArrayAdapter(Context context){
super(context, R.layout.menuitem_row);
}
//get views
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);
v.setFocusable(true);
}
//assign values to view
final MenuItem item = this.menuItems.get(position);
TextView nameView = (TextView) v.findViewById(R.id.item_name);
final TextView priceView = (TextView) v.findViewById(R.id.item_price);
nameView.setText(item.getName() + " ");
priceView.setText("€"+ String.valueOf(item.getPrice()));
//number picker
np = (NumberPicker)v.findViewById(R.id.numpick);
np.setMaxValue(20);
np.setMinValue(0);
np.setValue(0);
np.setFocusable(false);
//calculation occurs when values are changed...
np.setOnValueChangedListener( new OnValueChangeListener() {
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
Toast.makeText(picker.getContext(), "dish: " + item.getName() + " amount: " + picker.getValue(), Toast.LENGTH_SHORT).show();
Toast.makeText(picker.getContext(), "new Value: " + newVal + " old Value: " + oldVal, Toast.LENGTH_SHORT).show();
// amount += item.getPrice() * picker.getValue();
if(newVal > oldVal){
total = (item.getPrice() * newVal) - item.getPrice() * oldVal;
//add to order
order.add(item);
amount += total;
Toast.makeText(picker.getContext(), "ADDED TO ORDER: " + item.getName(), Toast.LENGTH_SHORT).show();
}
if(newVal < oldVal){
total = (item.getPrice() * oldVal) - item.getPrice() * newVal;
//remove from order
order.remove(item);
amount -= total;
Toast.makeText(picker.getContext(), "REMOVED FROM ORDER: " + item.getName(), Toast.LENGTH_SHORT).show();
}
price.setText("€" + String.valueOf(amount));
}
});
return v;
}
public List<MenuItem> getOrder() {
return order;
}
public void resetNumberPicker(){
np.setValue(0);
}
}
次に、ListView アクティビティでこのメソッドを呼び出します。
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if(result){
pDialog.dismiss();
adapter = new MenuItemArrayAdapter(StartersActivity.this, starters, price);
adapter.resetNumberPicker();
StartersActivity.this.setListAdapter(adapter);
}
}
しかし、私はこのエラーが発生します:
致命的な例外: com.example.waitron5.MenuItemArrayAdapter.resetNumberPicker(MenuItemArrayAdapter.java:104) での main java.lang.NullPointerException
これはlogcatです:
FATAL EXCEPTION: main
01-21 18:04:40.053: E/AndroidRuntime(18291): java.lang.NullPointerException
01-21 18:04:40.053: E/AndroidRuntime(18291): at com.example.waitron5.MenuItemArrayAdapter.resetNumberPicker(MenuItemArrayAdapter.java:104)
01-21 18:04:40.053: E/AndroidRuntime(18291): at com.example.waitron5.StartersActivity$HTTPTask.onPostExecute(StartersActivity.java:215)
01-21 18:04:40.053: E/AndroidRuntime(18291): at com.example.waitron5.StartersActivity$HTTPTask.onPostExecute(StartersActivity.java:1)
01-21 18:04:40.053: E/AndroidRuntime(18291): at android.os.AsyncTask.finish(AsyncTask.java:631)
01-21 18:04:40.053: E/AndroidRuntime(18291): at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-21 18:04:40.053: E/AndroidRuntime(18291): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
01-21 18:04:40.053: E/AndroidRuntime(18291): at android.os.Handler.dispatchMessage(Handler.java:99)
01-21 18:04:40.053: E/AndroidRuntime(18291): at android.os.Looper.loop(Looper.java:137)
01-21 18:04:40.053: E/AndroidRuntime(18291): at android.app.ActivityThread.main(ActivityThread.java:5039)
01-21 18:04:40.053: E/AndroidRuntime(18291): at java.lang.reflect.Method.invokeNative(Native Method)
01-21 18:04:40.053: E/AndroidRuntime(18291): at java.lang.reflect.Method.invoke(Method.java:511)
01-21 18:04:40.053: E/AndroidRuntime(18291): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-21 18:04:40.053: E/AndroidRuntime(18291): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-21 18:04:40.053: E/AndroidRuntime(18291): at dalvik.system.NativeStart.main(Native Method)
エラーはこの行 104 で発生しています。
np.setValue(0);
NumberPicker
npへの参照を取得していないことが原因である可能性があることに気付きました。しかし、これがNPEを返さないようにコードを修正するにはどうすればよいですか?