【问题标题】:Resetting value of NumberPicker inside ListView item重置 ListView 项内 NumberPicker 的值
【发布时间】:2013-01-21 18:07:19
【问题描述】:

我有一个ListView 活动,在列表中的每个项目上都有一个NumberPicker 视图。用户可以使用此选择器添加/删除项目。它正在工作,但是我遇到的问题是,当我恢复 ListView 活动时,当我希望将它们设置为 0 时,这些值仍处于所选值。

有什么办法可以做到吗? 到目前为止,我在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);              
        }
    }

但我收到此错误:

致命异常:com.example.waitron5.MenuItemArrayAdapter.resetNumberPicker(MenuItemArrayAdapter.java:104) 的主要 java.lang.NullPointerException

这是日志猫:

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) 并停止了崩溃,但问题是当重新加载活动时,数字选择器中的值尚未重置
  • "activity is reloaded" 意味着重新启动它?那么你需要在 Resume 上调用 Activity 中的 resetNumberPicker 方法
  • 是的,对不起,我应该更具体。我已经这样做了,但问题仍然存在。有没有办法可以重置 MenuItemArrayAdapter 类的 getView() 方法内的 NumberPicker?

标签: android nullpointerexception android-arrayadapter numberpicker


【解决方案1】:

您不能(也不应该)像以前那样连接到在 getView() 方法中创建的行视图(您也不需要适配器中的静态 NumberPicker 字段)。由于您总是在getView() 方法中将NumberPicker 的值设置为0,您可以尝试在resetNumberPicker() 方法中简单地调用notifyDataSetChanged()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2014-06-07
    • 2016-12-22
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    相关资源
    最近更新 更多