2013-01-06 1 views
0

사용자가 숫자 선택기 위젯에서 값을 변경할 때 TextView에 표시된 값을 업데이트하려고합니다. com.example.waitron5에서숫자 선택기를 사용하여 TextView를 업데이트하려고 시도했습니다.

java.lang.NullPointerException이 :

나는 숫자 피커 설정하고 나는 다음과 같은 오류를 얻을 텍스트 뷰의 .setText() 메서드를 호출 할 때 그러나 제대로 작동합니다. MenuItemArrayAdapter.onValueChange (MenuItemArrayAdapter.java:68는) 다음

코드는 오류가 MenuItemArrayAdapter 클래스에서 발생하는 것으로 보인다 곳에 대응 :

@Override 
public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 
    Toast.makeText(this.getContext(), "Change: " + picker.getValue(), Toast.LENGTH_SHORT).show(); 
    //if oldVal > newVal increment price 
    price.setText("xyz"); 
    //if oldVal < newVal decrement price 
} 

청취자가 제대로 작동하는지 테스트하기 위해 Toast 메시지를 입력했습니다. 그런 다음 setText() 메서드를 추가했지만 오류가 발생했습니다.

문제에 대한 도움을 주시면 감사하겠습니다. 나는 MenuItemArrayAdapter 클래스의 상단에있는 텍스트 뷰를 선언 :

private TextView price; 

참고 : 수 선택기는 목록의 각보기에 포함된다. 그래서 MenuItemAdapter 클래스가 있습니다. 문제가 잘못된 위치에서 textView를 업데이트하는 것과 관련이 있습니까?

다음은 MenuItemAdapter 클래스의 getView() 메소드입니다.

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

    //assign values to view 
    MenuItem item = this.menuItems.get(position); 

    TextView nameView = (TextView) v.findViewById(R.id.item_name); 
    TextView priceView = (TextView) v.findViewById(R.id.item_price); 

    nameView.setText(item.getName() + " "); 
    priceView.setText("€"+ String.valueOf(item.getPrice())); 

    price = (TextView)v.findViewById(R.id.price); 

    //number picker 
    np = (NumberPicker)v.findViewById(R.id.numpick); 
    np.setMaxValue(99); 
    np.setMinValue(0); 
    np.setValue(0); 

    np.setOnValueChangedListener(this); 

    return v; 

} 
+0

'가격'에 값을 할당 한 적이 있습니까? – Henry

+0

기본적으로 나는 XML 레이아웃 파일에서 android : text = ""를 사용하여 "0.00 €"값을 할당했습니다. – Javacadabra

+0

'setContentView' 다음에'price' 텍스트 뷰를 초기화해야합니까? –

답변

2

ListView의 각 행에서 사용할 수있는 텍스트 뷰 price인가?
대답은 아니오라고 가정합니다. 화면에 총 가격을 표시해야하는 단일 TextView가있는 것 같습니다. 내 가정이 맞다 경우 priceR.layout.menuitem_row 레이아웃에서 검색 될 것이다

는, 당신은 getView()

price = (TextView)v.findViewById(R.id.price); 

price을 인스턴스화 할 sould. TextView가 없으면 사용하려고 할 때 NullPointer가 throw됩니다.

해결책은 기본 레이아웃이 선언 된 onCreate()에서 price을 인스턴스화 한 다음 MenuItemArrayAdapter에 매개 변수로 전달하는 것입니다. 이 같은

뭔가 :

// .... 
TextView price = (TextView)findViewById(R.id.price); 
adapter = new MenuItemArrayAdapter(this, price); 
this.setAdapter(adapter) 
//.... 

는 그런 다음 텍스트 뷰에 동의 MenuItemArrayAdapter의 생성자를 수정 :

public MenuItemArrayAdapter(Context context, TextView price){ 
    this.context = context; 
    this.price=price 
} 

그 후에 당신은 그것을 업데이트 할 안전하게 price를 사용할 수 있습니다.

+0

나는 그것을 시도 할 것이고, 나는 당신의 제안에 대해 좋은 느낌을 가지고있다. 그것은 많은 의미를 가진다! – Javacadabra

+0

감사합니다. 다시 한번 큰 시간을 도왔습니다! – Javacadabra

+0

환영합니다! 다행이 당신을 도왔습니다! –

관련 문제