목록의 각 항목에 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를 반환하지 않도록 코드를 수정하려면 어떻게해야합니까?
u가 setValue를 호출하기 전에 NULL을 확인하려고 했습니까? –
np.setValue (0)'이 (np! = null) np.setValue (0)'하고 충돌을 멈추었지만 액티비티가 다시로드되면 숫자 선택기의 값이 재설정되지 않았습니다 – Javacadabra
"활동이 다시로드됩니다. "다시 시작하는 것을 의미합니까? 그럼 당신은 이력서에서 활동에 resetNumberPicker 메서드를 호출해야합니다 –