我有一個ListView
活動,該列表中的每個項目都有一個NumberPicker
視圖。用戶可以使用這個選擇器添加/刪除項目。它正在工作,但我的問題是,當我恢復ListView
活動的價值仍然在選定的值,當我希望他們設置爲0.在ListView項目內重置NumberPicker的值
有什麼辦法可以做到這一點? 到目前爲止,我已經在我的MenuItemArrayAdapter
類中完成了以下內容,我添加了一個方法來重置數字選擇器。
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);
}
}
,但我得到這個錯誤:
致命異常:主要顯示java.lang.NullPointerException在com.example.waitron5.MenuItemArrayAdapter.resetNumberPicker(MenuItemArrayAdapter.java:104)
這是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?
你試過在調用setValue之前檢查np是否爲NULL? –
我做了這個'if(np!= null)np.setValue(0)'並且停止了崩潰,然而問題是當重新加載活動時,數字選擇器中的值沒有被重置 – Javacadabra
「活動被重新加載「意味着再次啓動它?那麼你需要在Resume –