Android事件总线不适用于两个事件监听器。

8
在我的Android应用程序中,我使用了一个Activity和适配器来显示列表视图。我的需求是需要通过事件监听器使用EventBus来使适配器类和活动之间进行通信,因此我创建了两个事件监听器类。
我的流程如下:
1)我在活动中有一个按钮,该按钮应与适配器类通信。
2)如果我点击文本视图(列表视图的文本视图小部件),则应与活动类通信。
以下代码可以使适配器与活动通信,但活动并不能与适配器类通信。请帮助我解决如何使这两个类都能相互通信的问题?
我已发布了完整的示例项目代码:
活动类:
    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);
        }

    }

适配器类:

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
你为什么有两个 EventBus 实例? - CommonsWare
请查看我的更新问题。 - M.A.Murali
3个回答

6
不要每次创建新的 EventBus 实例,使用 EventBus.getDefault()。 在两个类中添加方法 public void onEvent(Object event)

1
感谢您的留言,请查看我更新的问题,因为通信无法在第二类中工作。 - M.A.Murali
你忘记在第二个类中调用EventBus.getDefault().register()。 - Natali
如果我在适配器类的构造函数中注册事件总线,我会得到以下异常。Caused by: de.greenrobot.event.EventBusException: 订阅者类com.mkyong.android.ListMobileActivity已经注册到事件类com.mkyong.android.TestFinishedEvent。 - M.A.Murali
2
在 onCreate 活动方法中,删除 EventBus.getDefault().register(this.context) 并添加 register EventBus.getDefault().register(adapter)。同时,在 onDestroy 活动方法中添加 EventBus.getDefault().unregister(this); 和 EventBus.getDefault().unregister(adapter);。 - Natali
如何在BroadcastReceiver的onReceive方法中使用事件监听器。如果我使用EventBus.getDefault().register(this);,我会得到“没有名为onEvent的方法”的错误,请帮助我。 - M.A.Murali
尝试在你想要调用EventBus.getDefault().register(this)的类中添加onEvent(Object o)方法。 - Natali

4
在你的MobileArrayAdapter构造函数中,
修改
 EventBus.getDefault().register(this.context)

为了

EventBus.getDefault().register(this)

编辑1:

还要注意,当您不需要接收事件或活动停止/销毁时,您始终应该调用EventBus.getDefault().unregister(this);


如何在BroadcastReceiver的onReceive方法中使用事件监听器。如果我使用EventBus.getDefault().register(this);,我会得到“没有叫做onEvent的方法”的错误,请帮助我。 - M.A.Murali

0

你的Activity必须注册到EventBus。

在你的Activity类中, 在onStart()方法中订阅事件 在onStop()方法中取消订阅事件

在你的适配器中, 只需发布你的事件,所有订阅者都会收到你发布的事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接