문제

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

}

I then call this method in the ListView activity:

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

but i get this error:

FATAL EXCEPTION: main java.lang.NullPointerException at com.example.waitron5.MenuItemArrayAdapter.resetNumberPicker(MenuItemArrayAdapter.java:104)

this is the 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)

The error is occuring at this line 104:

np.setValue(0);

I realise that it is perhaps because I am not getting a reference to the NumberPicker np. But How can I fix my code so that this will not return an NPE?

도움이 되었습니까?

해결책

You can't(and you shouldn't) connect to the row views created in the getView() method like you did(you also don't need that static NumberPicker field in the adapter). As you always set the value of the NumberPicker to 0 in the getView() method you could try simply calling notifyDataSetChanged() in the resetNumberPicker() method.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top