2015-05-05 9 views
7

W mojej aplikacji Android użyłem Activity i Adaptera do widoku listy, moja akwizycja musi komunikować zarówno klasę adaptera jak i aktywność poprzez detektor zdarzeń za pomocą EventBus, tak że utworzyłem dwie klasy detektorów zdarzeń.Android Event bus nie działa z dwoma detektorami zdarzeń

mój proces jest:

1) Mam przycisku w aktywności, przycisk powinien komunikować klasy adaptera.

2) Jeśli kliknę widok tekstu (widżety widoków tekstowych widoku listy) powinien komunikować się z klasą aktywności.

Poniższy kod działa, gdy adapter komunikuje się z działaniem, ale działanie nie komunikuje się z klasą adaptera. Pomóż mi, jak komunikować się na obu zajęciach?

Pisałem mój pełny kod przykładowy projekt: Klasa

działalność: klasę

public class ListMobileActivity extends Activity {....}; 

     private ListView list; 
     private Button btn; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      EventBus.getDefault().register(ListMobileActivity.this); 
      ...... 
      list.setAdapter(adapter); 

// Does not communicates with Adapter. 
      btn.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View arg0) { 
        EventBus.getDefault().post(new TestEvent2("test event")); 
       } 
      }); 
     } 

     public void onEvent(TestFinishedEvent event) { 
      Log.e("TestFinishEvent ", event.test); 
     } 

    } 

adaptera:

public class MobileArrayAdapter extends ArrayAdapter<String> { 
    private final Context context; 
    private final String[] values; 

    public MobileArrayAdapter(Context context, String[] values) { 
     super(context, R.layout.list_mobile, values); 
     this.context = context; 
     this.values = values; 
     EventBus.getDefault().register(this.context); // registered here. 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View rowView = inflater.inflate(R.layout.list_mobile, parent, false); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.logo); 
     textView.setText(values[position]); 
     ......... 
     // its works, communicate with Activity 
     textView.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       EventBus.getDefault().post(new TestFinishedEvent("ssds")); 
      } 
     }); 
     return rowView; 
    } 

    public void onEvent(TestEvent2 event) { 
     Log.e("Test event 2 ", event.test); 
    } 
} 
+2

Dlaczego masz dwie instancje 'EventBus'? – CommonsWare

+0

proszę zobaczyć moje zaktualizowane pytanie. –

Odpowiedz

6

Nie twórz nowe EventBus instancji za każdym razem, użyj EventBus.getDefault(). Dodaj zarówno metody klas public void onEvent(Object event)

+1

Dzięki za komentarz i moje zaktualizowane pytanie dotyczące komunikacji nie działa dla drugiej klasy. –

+0

Zapominasz wywołać EventBus.getDefault(). Zarejestruj się w drugiej klasie – Natali

+0

Jeśli zarejestruję magistralę zdarzeń w konstruktorze klasy adaptera, otrzymałem następujący wyjątek. Spowodowane przez: de.greenrobot.event.EventBusException: Klasa subskrybenta com.mkyong.android.ListMobileActivity już zarejestrowana w klasie zdarzenia com.mkyong.android.TestFinishedEvent –

4

W konstruktora MobileArrayAdapter

zmiana

EventBus.getDefault().register(this.context) 

do

EventBus.getDefault().register(this) 

Edit 1:

Pamiętaj też, że zawsze powinieneś zadzwonić pod numer EventBus.getDefault().unregister(this); , gdy nie potrzebujesz otrzymywać wydarzeń lub działalność jest zatrzymywana/niszczona

+0

dzięki jego pracom teraz. –

+0

sposób korzystania z nasłuchiwania zdarzeń w metodzie onReceive programu BroadcastReceiver. jeśli używam EventBus.getDefault(). register (this); Mam "nie ma metody zwanej onEvent", pomóż mi. –

0

Twoja aktywność musi się zarejestrować w EventBus.

w klasie Activity zapisz si? W na onStart() Unsuscribe w OnStop()

W adaptera Wystarczy wlać wydarzenie, wszystko suscriber otrzymać zdarzenie post.

Powiązane problemy