1

목록의 각 항목에 NumberPicker보기가있는 ListView 활동이 있습니다. 사용자는이 선택기를 사용하여 항목을 추가/제거 할 수 있습니다. 그러나 문제는 내가 가지고있는 문제는 내가 ListView 활동을 재개 할 때 그 값을 0으로 설정하고 싶을 때 값이 여전히 선택되어있을 때입니다.ListView 항목에서 NumberPicker 값을 재설정하는 중

내가이 작업을 수행 할 수있는 방법이 있습니까? 지금까지 내 MenuItemArrayAdapter 클래스 내부에서 다음을 수행했습니다. 숫자 선택 도구를 재설정하는 메소드를 추가합니다. 그때 ListView에 활동에서이 메서드를 호출

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); 
} 

은} :

치명적인 예외 : 주요 java.lang.NullPointerException이에서

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)

오류가이 라인 (104)에서 발생하는되어

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) 

:

np.setValue(0); 

나는 내가 NumberPicker 순이익에 대한 참조를 받고 있지 않다 있기 때문에 아마도 실현

이은 로그 캣입니다. 하지만이 코드가 NPE를 반환하지 않도록 코드를 수정하려면 어떻게해야합니까?

+1

u가 setValue를 호출하기 전에 NULL을 확인하려고 했습니까? –

+0

np.setValue (0)'이 (np! = null) np.setValue (0)'하고 충돌을 멈추었지만 액티비티가 다시로드되면 숫자 선택기의 값이 재설정되지 않았습니다 – Javacadabra

+0

"활동이 다시로드됩니다. "다시 시작하는 것을 의미합니까? 그럼 당신은 이력서에서 활동에 resetNumberPicker 메서드를 호출해야합니다 –

답변

0

getView() 메서드에서 만든 행 뷰에 연결하면 안됩니다 (어댑터에 정적 NumberPicker 필드가 필요하지 않음). getView() 메서드에서 항상 NumberPicker의 값을 0으로 설정하면 resetNumberPicker() 메서드에서 notifyDataSetChanged()을 호출하기 만하면됩니다.

+0

감사합니다. – Javacadabra