绿色机器人事件总线 Post 和获取 ArrayList NPE
Green Robot Event Bus Post and Get ArrayList NPE
我有一个片段 ui,其中有一个 recyclerview-checkbox 列表。此片段是对话框片段中托管的两个选项卡的标签布局的一部分。托管片段包含一个按钮,从中可以收集和使用 ids/names 个选中的 recyclerview 项目。
我已经使用绿色机器人 post 包含所选项目的列表,并在单击按钮时在托管片段中检索它们,但我遇到了 NPE。
这是我的实现:
POJO Class:
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));
}
}
我从我的适配器 post 是不是错了,因为标签片段在尝试收集选中的项目时有 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));
}
}
您需要在下面的方法中传递参数
@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));
}
}
当您使用 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.
...
}
我解决了这个问题,因为用 @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
从列表中检索值。问题解决了。感谢所有回复的人。
我有一个片段 ui,其中有一个 recyclerview-checkbox 列表。此片段是对话框片段中托管的两个选项卡的标签布局的一部分。托管片段包含一个按钮,从中可以收集和使用 ids/names 个选中的 recyclerview 项目。
我已经使用绿色机器人 post 包含所选项目的列表,并在单击按钮时在托管片段中检索它们,但我遇到了 NPE。
这是我的实现:
POJO Class:
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));
}
}
我从我的适配器 post 是不是错了,因为标签片段在尝试收集选中的项目时有 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));
}
}
您需要在下面的方法中传递参数
@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));
}
}
当您使用 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.
...
}
我解决了这个问题,因为用 @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
从列表中检索值。问题解决了。感谢所有回复的人。