1

我有一個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?

+1

你試過在調用setValue之前檢查np是否爲NULL? –

+0

我做了這個'if(np!= null)np.setValue(0)'並且停止了崩潰,然而問題是當重新加載活動時,數字選擇器中的值沒有被重置 – Javacadabra

+0

「活動被重新加載「意味着再次啓動它?那麼你需要在Resume –

回答

0

您不能(也不應該)連接到像getView()方法中創建的行視圖(您也不需要適配器中的該靜態NumberPicker字段)。由於您總是在getView()方法中將NumberPicker設置爲0,因此您可以嘗試簡單地在resetNumberPicker()方法中調用notifyDataSetChanged()

+0

工作感謝你 – Javacadabra