绿色机器人事件总线发布并获取ArrayList NPE

时间:2019-03-02 03:32:17

标签: android android-fragments greenrobot-eventbus

我有一个片段ui,其中包含一个recyclerview-checkbox列表。该片段是对话框片段中两个选项卡的选项卡布局的一部分。托管片段包含一个按钮,通过该按钮可以收集并使用已检查的recyclerview项的ID /名称。

我已经使用绿色机器人发布了包含所选项目的列表,并在单击按钮时在托管片段中检索了它们,但是我得到了NPE。

这是我的实现方式

POJO类:

public class MySessionEvents {

public List<String> strings;

public MySessionEvents(List<String> strings) {
    this.strings = strings;
}

public List<String> getStrings() {
    return strings;
}
}

适配器逻辑:

viewholder.checkBoxSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                Log.d(TAG, "Session id:\t" + sessions.prog_sessionId);
                selectedSessionsList.add(sessions.prog_sessionId);

                Bus.getBus().post(new MySessionEvents(selectedSessionsList));

                for (int m = 0; m < selectedSessionsList.size(); m++) {
                    Log.d(TAG, "Session id in list:\t" + selectedSessionsList.get(m));
                }
            }
        }
    });

并检索字符串,我已经注册并取消注册了总线(跳过了代码)并执行了以下操作:

@Subscribe
public void retrieveMySessions() {
    Log.d(TAG, "From event:\t" + events.getStrings());
     //for (int i = 0; i < events.strings.size(); i++){
    for (int i = 0; i < events.getStrings().size(); i++){
        Log.d(TAG, "My Session Ids:\t" + events.strings.get(i));
    }
}

由于尝试收集已检查项目时选项卡片段具有NPE,我是否从适配器发布错误?我的检索正确吗? 谢谢。

编辑:---将参数添加到订阅方法中---

//    public void retrieveMySessions(MySessionEvents events) {
@Subscribe
public void retrieveMySessions() {
    Log.d(TAG, "From event:\t" + events.getStrings());
//  for (int i = 0; i < events.strings.size(); i++){
    for (int i = 0; i < events.getStrings().size(); i++){
        Log.d(TAG, "My Session Ids:\t" + events.strings.get(i));
    }
}

3 个答案:

答案 0 :(得分:1)

您需要在下面的方法中传递参数

@Subscribe
public void retrieveMySessions(MySessionEvents event) {
    Log.d(TAG, "From event:\t" + events.getStrings());

    for (int i = 0; i < events.getStrings().size(); i++){
        Log.d(TAG, "My Session Ids:\t" + events.strings.get(i));
    }
}

答案 1 :(得分:1)

在使用Event Bus时,需要记住两个参与者。 发布者订阅者

发布者将告知订阅者有关数据的更改。订户是数据更改的侦听器,即。监听发布者所做的数据更改。因此,只要您的发布商通过以下方式通知订户有关数据的更改:

Bus.getBus().post(new MySessionEvents(selectedSessionsList));

订户需要使用具有相同对象的方法来监听它,该对象持有数据更改:

@Subscribe
public void retrieveMySessions(MySessionEvents events) {
  // data changes is in the events parameter, do something about it.

  ...
}

答案 2 :(得分:0)

我解决了这个问题,因为用@subscribe注释的方法不需要在任何地方调用。我只是在方法中执行了操作,并获得了通过总线发送的值,如下所示:

@Subscribe
public void retrieveMySessions(MySessionEvents events) {
    myItemsList = events.getStrings();
}

在这种情况下,我已将项目添加到列表中,并在需要的地方使用了这样的内容:

NewProgramDialog dialog = new NewProgramDialog();

    Bundle bundle = new Bundle();
    String s = new Gson().toJson(myItemsList);
    bundle.putString(KEY_MY_SESSIONS, s);
    bundle.putBoolean("from_selections", true);

    dialog.setArguments(bundle);
    dialog.show(getChildFragmentManager(), "NewProgramDialog");

    dismiss();

我使用Gson从列表中检索值。问题解决了。感谢所有回应。