Green Robot Event Bus Пост и получение NPE ArrayList - PullRequest
0 голосов
/ 02 марта 2019

У меня есть фрагмент пользовательского интерфейса, у которого есть список checkbox view-checkbox.Этот фрагмент является частью табуляции двух вкладок, размещенных во фрагменте диалога.Фрагмент хостинга содержит кнопку, из которой собираются и используются идентификаторы / имена проверенных элементов повторного просмотра.

Я использовал зеленый робот, чтобы опубликовать список, содержащий выбранные элементы, и получил их во фрагменте хостинга на кнопке.щелкните, но я получаю 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 голосов
/ 02 марта 2019

Когда вы используете 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.

  ...
}
0 голосов
/ 03 марта 2019

Я решил эту проблему, потому что метод, аннотированный @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, чтобы получить значения из списка.Задача решена.Спасибо всем, кто откликнулся.

0 голосов
/ 02 марта 2019

Вам необходимо передать параметр в следующем методе

@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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...