2012-04-20 4 views
7

익명의 내부 클래스에서 초기화되지 않았을 수 있습니다 나의 코드 초기화되지 않았습니다. 이 문제를 해결할 방법이 있습니까? 나는 잠재적으로 null을 콜백을 설정할 수 있습니다. 객체를 생성 한 다음 나중에 변경하면 콜백을 설정할 수 있지만 더 깨끗한 방법이되기를 바랍니다. 어떤 아이디어? (Foo가 저에게 쓰여지지 않았고 나중에 콜백을 변경하기위한 인터페이스를 공개하지 않으면 작동하지 않습니다)최종 지역 변수가 여기에

내 특정 시나리오에서 Foo가 ArrayAdapter이고 bar는 notifyDataSetChanged()입니다. 어댑터가 표시하는 내용은 배열의 항목 값에 따라 달라지며 해당 값을 클릭하면 변경됩니다. 콜백은 clickListener입니다.

당신은 포함하는 클래스의 방법 callBarOnMyFoo를 선언하고 콜백에서 호출 할 수
+1

:

class CallbackHelper { private Foo foo; public void setFoo(Foo f){ foo = f; } public Foo getFoo(){ return foo; } } 

을 그리고 다음과 같이 사용 _this.bar() _ 또는 _bar() _?를 참조하십시오. –

+0

아니요, 실제 코드가이 예제보다 복잡하며 콜백이 다른 익명 내부 클래스에 있습니다 – Drew

+0

왜 notifyDataSetChanged를 재정의하겠습니까? API 문서에서 myFoo.registerDataSetObserver (new DataSetObserver() {})를 호출해야합니다. – sharakan

답변

6

짧은 대답은 당신이 확실히 Java에서 그렇게 할 수 없다는 것입니다. 그러나 컴파일러는 이미 당신에게 그렇게 말했습니다. 한 번에 두 개의 객체를 만들려고하고 있는데, 서로에 대한 참조는 닭고기와 계란의 문제입니다. 결론적으로, 먼저 그 중 하나를 만들어야합니다. 다음

.... 
final MyArrayAdapter aa = new MyArrayAdapter(); 
aa.initializeButtonClickListener(); 
.... 

어댑터으로 '초기화'방법을 추가

제안은 두 단계로 생성된다.

public void initializeButtonClickListener(){ 
    this.button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     onClick(){ 
      notifyDataSetChanged(); 
     } 
    }); 
} 

그 구조가 다소 복잡하기 때문에 (즉, 단순히 생성자를 호출하는 것보다 더 복잡), 나는 다음 MyArrayAdapter 팩토리 메소드에 두 줄을 당겨, 그리고 생성자 개인을 권 해드립니다.

+0

좋아, 나는 이것이 왜 불가능한 지 알 수있다. 첫 번째 객체가 생성 된 후 콜백을 설정하기 위해 다시 작성했습니다. 내가 왜 notifyDataSetChanged()를 호출해서는 안되는지 모르겠다. 배열의 한 요소가 바뀌면 모든 것을 다시 그리기를 원한다. – Drew

+0

흠 ... 나는 네 이름에서 혼란스러워했다. Inner가 DataSetObserver이고 Adapter가 호출하고 호출하지 않는다고 생각했습니다. ClickListener (즉, 내부)가 듣고있는 객체는 어디에 있습니까? 나는 세 줄이있을 것이라고 생각한다. ArrayAdapter를 만들고, .notifyDataSetChanged를 호출하는 ClickListener를 만든 다음 ArrayAdapter를 'model'로 사용하는 'Clickable'(View, 나는 가정) 객체를 만든 다음 view.setOnClickListener (청취자)가 원을 완성합니다. – sharakan

+0

좋아요. 실제 시나리오와 함께 버전을 추가했습니다. 클릭 리스너가 연결된 단추는 어댑터 안에 있습니다. – Drew

0

:

void callBarOnMyFoo() { 
    myFoo.bar(); 
} 

그런 다음 콜백는 외부 클래스의 인스턴스 방법입니다 callBarOnMyFoo,의 Inner를 호출해야합니다 코드에 대한 참조가 있어야합니다 (구문을 잊어 버렸습니다).

+0

myFoo는 로컬 변수이지만 callBarOnMyFoo는 액세스 할 수 없습니다.나는 그것을 회원으로 바꿀 수있을 것 같지만, 그것은 건설 후 청취자를 세우는 나의 해결책만큼이나 추한 것 같다. – Drew

3

이 일반적으로 및 액세스 Inner 정의없이 작동하지만이 헬퍼 클래스 작성해야합니까 : 당신이 단지 수 없습니다

final CallbackHelper cbh = new CallbackHelper(); 
Foo myFoo = new Foo(new Inner() { 
    @Override 
    callback(){ 
     cbh.getFoo().bar(); 
    } 
}); 
cbh.setFoo(myFoo); 
관련 문제