2014-11-04 3 views
1

안녕하세요, 어댑터 사용자 정의 클래스에서 findViewById를. 내 getView에서 setOnCheckedChangeListener 및 onCheckedChanged 처리기를 내 체크 박스에 구현했습니다.안드로이드 전화는 <p></p> 그래서 나는 각 행의 체크 박스입니다 항목을 가지고있는 사용자 정의 어댑터와 사용자 정의 목록보기를

이제 문제는 다음과 같습니다

나는 그렇게 관련된 가격이 내가 (할 각 항목에 대해 그 가정의 값으로 외부 텍스트 뷰를 업데이 트하려는 목록의 항목 중 하나를 선택 취소/체크 할 때마다 나는 목록 아래에 총 가격을 보여주고 싶다).

어댑터의 getView에서 "외부"보기에 어떻게 접근해야합니까? 다른 해결 방법은 무엇입니까?

CheckBox name = (CheckBox) view.findViewById(R.id.product); 
    name.setText(content[i][0]); 
    final View v = view; 
    final int position = i; 
    name.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton group, boolean isChecked) { 
      setCheckedItem(position); 
      EditText quantity = (EditText) v.findViewById(R.id.product_quantity); 
      content[position][3] = quantity.getText().toString(); 
      Iterator<String> it = getCheckedItems().values().iterator(); 
      Double total = 0.0; 
      for (int i=0;i<getCheckedItems().size();i++){ 
       Integer quantity_p = Integer.parseInt(getItem(position)[3]); 
       Double price = Double.parseDouble(getItem(position)[2]); 
       total += quantity_p*price; 
      } 
      TextView total_price = (TextView) findViewById(R.id.total_products_price); 
      total_price.setText(total.toString()); 
     } 
    }); 

주의 마지막 두 줄 :

나는 내 사용자 지정 어댑터의 getView 기능 여기에 내 코드의 일부를 남겨 나는 내가 findViewById를 호출 할 수 없습니다 알고 있지만 나도 몰라 무엇을 지금까지해야 할 일. 어떤 제안이라도 좋을 것입니다. 고마워요.

+0

여기에 클래스 코드와 xml 파일을 입력 할 수 있습니까? –

+0

어댑터 클래스를 활동 클래스에 넣으십시오. –

답변

1

TextView을 생성자의 어댑터로 전달할 수 있습니다. 이 후에는이 같은 CompoundButton.OnCheckedChangedListener을 구현하는 private static 클래스를 가질 수 있습니다이 단지 setOnCheckedChangedListenernew MyOnCheckedChangedListener (myTextView) (당신이 Adapter에 전달 된 하나) 후

private static class MyOnCheckedChangedListener 
        implements CompoundButton.OnCheckedChangedListener { 
    TextView myView; 
    public MyOnCheckedChangedListener (TextView viewToChange) { 
     myView = viewToChange; 
    } 

    @Override 
    public void onCheckedChanged(CompoundButton group, 
           boolean isChecked) { ... } 
} 

을하고 당신은 갈 준비가 된 것입니다.

+0

내가 한 것은 construtor에서 TextView를 전달한 다음 마음에 들었을 때만 사용하고 완벽하게 작동하는 것입니다. D – user3424226

0

내이 같은 일을 할 수있다 :

  1. 당신은 당신의 어댑터 생성자에 텍스트 뷰 참조를 전달하고 값을 변경하는 데 사용할 수 있습니다.

  2. 그러나 액티비티와 콜백 메소드 업데이트 textview에 interface을 구현하는 것이 좋습니다. 당신을 위해 어댑터가 생성자에서 액티비티 참조를 전달하고 참조를 사용하여 interface 콜백 메소드를 호출하십시오.

a)는 활동이 인터페이스

public MainActivity extends Activity implments UpdateTextviewInterface

을 구현하자 그 메소드를 오버라이드 (override) interace) B

public Interface UpdateTextviewInterface { void updateTextview(String value); }

로 되세요.

c) 어댑터 생성자에 활동 참조를 전달합니다. 텍스트 참조를 업데이트하려면 활동 참조 전화 updateTextview 메서드를 사용하십시오.

0

여기는 단지 생각과 이론에 불과합니다. 하지만 변경하려는 TextView가 선언 된 곳에서 정적 메서드를 만들 수 있으며, 그 메서드에서는 텍스트를 변경하는 코드를 변경할 수 있습니다.

그런 다음 BaseAdapter에서 해당 정적 메서드를 호출하십시오. 정적이라고 말하면 전체 클래스의 새 인스턴스를 만들 필요가 없습니다.

+0

그 안에 findViewById를 호출하는 정적 메서드 para를 추가하려했으나 허용되지 않았습니다. ("정적이 아닌 메서드 findViewById 정적 컨텍스트에서 참조 할 수 없습니다.") – user3424226

2

어댑터 클래스를 활동 클래스에 넣으십시오. 온 작성에 다음

total_price = (TextView) findViewById(R.id.total_products_price); 

주요 활동 클래스 에 TextView total_price를 선언합니다. total_priceonCheckedChanged 안에 액세스 할 수 있습니다. 이것을 시도해도 효과가있을 수 있습니다.

+0

그것은 작동하지만 모든 파일을 하나의 파일에서 혼합 엉망이 될 것이라고 때문에 그 솔루션에서 도망 치고 싶지 :/ – user3424226

+0

Plz 전체 코드를 공유하면 어떻게 이런 방식으로 ID를 얻을 수 있습니까? –