1

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

NumberPickernpへの参照を取得していないことが原因である可能性があることに気付きました。しかし、これがNPEを返さないようにコードを修正するにはどうすればよいですか?

4

1 に答える 1

0

getView()メソッドで作成された行ビューに接続することはできません (接続すべきではありませんNumberPicker)。NumberPickerメソッドで常にtoの値を設定するので、0単にメソッドを呼び出してgetView()みることができます。notifyDataSetChanged()resetNumberPicker()

于 2013-01-21T18:46:08.143 に答える