Green Robot Event Bus Опубликовать и получить ArrayList NPE
У меня есть фрагмент пользовательского интерфейса, у которого есть список-флажок. Этот фрагмент является частью табуляции двух вкладок, размещенных во фрагменте диалога. Фрагмент хостинга содержит кнопку, из которой собираются и используются идентификаторы / имена проверенных пунктов повторного просмотра.
Я использовал зеленого робота, чтобы опубликовать список, содержащий выбранные элементы, и получил их во фрагменте хостинга по нажатию кнопки, но я получаю 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));
}
}
2 ответа
Вам нужно передать параметр в метод ниже
@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
для получения значений из списка. Проблема решена. Спасибо всем, кто откликнулся.