2015-05-05 34 views
7

In meiner Android-Anwendung habe ich eine Aktivität und Adapter für die Listenansicht verwendet, muss meine Erwerbung Adapter-Klasse und Aktivität über Event-Listener mit EventBus kommunizieren, so dass ich erstellt habe zwei Ereignis-Listener-Klassen.Android Event Bus funktioniert nicht mit zwei Event-Listener

Mein Prozess ist:

1) Ich habe eine Schaltfläche in der Aktivität, sollte die Schaltfläche Adapter Klasse kommunizieren.

2) Wenn ich auf Textansicht (Textansicht Widgets der Listenansicht) klicken, sollte die Aktivitätsklasse kommunizieren.

Mit dem folgenden Code funktioniert es für Adapter kommuniziert mit Aktivität, aber Aktivität kommuniziert nicht mit Adapterklasse. Bitte helfen Sie mir bei der Kommunikation für beide Klassen?

Ich habe meine volle Beispielprojekt Code geschrieben:

Aktivitätsklasse:

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

    } 

Adapter Klasse:

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

Warum haben Sie zwei 'EventBus' Instanzen? – CommonsWare

+0

Bitte sehen Sie meine aktualisierte Frage. –

Antwort

6

nicht neu EventBus Instanz jedes Mal, EventBus.getDefault() verwenden erstellen Sie. In den beiden Klassen Methode public void onEvent(Object event)

+1

Danke für Ihren Kommentar und bitte sehen Sie meine aktualisierte Frage für die Kommunikation funktioniert nicht für die zweite Klasse. –

+0

Sie vergessen, EventBus.getDefault() aufzurufen. Registrieren Sie in der zweiten Klasse – Natali

+0

Wenn ich Ereignis Bus bei Konstruktor der Adapterklasse registrieren, habe ich die folgende Ausnahme. verursacht durch: de.greenrobot.event.EventBusException: Abonnentenklasse com.mkyong.android.ListMobileActivity bereits für Ereignisklasse registriert com.mkyong.android.TestFinishedEvent –

4

In Ihrem MobileArrayAdapter Konstruktor

Änderung

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

zu

EventBus.getDefault().register(this) 

Edit 1:

Auch bewusst sein, dass Sie immer anrufen sollte EventBus.getDefault().unregister(this); sobald Sie wird gerade gestoppt keine Ereignisse oder Aktivität erhalten müssen/zerstört

+0

Dank seiner Arbeit jetzt. –

+0

Verwendung des Ereignis-Listeners in der OnReceive-Methode von BroadcastReceiver. Wenn ich EventBus.getDefault() verwende. register (this); Ich habe "hat keine Methode namens onEvent" bitte hilf mir. –

0

Ihre Aktivität zu EventBus registrieren.

In Ihrer Aktivitätsklasse Suscribe in auf onStart() abmelden möchten in OnStop()

In Ihrem Adapter einfach Ihre Veranstaltung gießen, alle Subscriber Ihre Post Ereignis empfangen.

Verwandte Themen