Отправить данные во фрагмент после инициализации - PullRequest
3 голосов
/ 13 марта 2019

У меня проблема при отправке данных на инициализированную вкладку.В методе getData() Я получил, что адаптер имеет значение NULL, а утилита просмотра также имеет значение NULL.

TabOne one = new TabOne()
one.getData(populatedList)

Ошибка следующая =>

java.lang.NullPointerException: Attempt to invoke virtual method 'void OneAdapter.setData(java.util.List)' on a null object reference.

Может быть, лучшая идея для отправки данных через пакет вфрагмент или, может быть, любая другая идея.

Я позвонил getData(), потому что здесь ответ от API.

public class TabOne extends Fragment {

        private Unbinder unbinder;

        @BindView(R.id.fab)
        FloatingActionButton floatingActionButton;

        @BindView(R.id.recycler_view_recycler)
        RecyclerView recyclerView;

        private OneAdapter oneAdapter;

        private List<Response> response = new ArrayList<>();

        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.tab_one, container, false);
            unbinder = ButterKnife.bind(this, view);

            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
            oneAdapter = new OneAdapter(getContext(), response);

            recyclerView.setLayoutManager(linearLayoutManager);
            recyclerView.setAdapter(oneAdapter);

            return view;
        }

        public void getData(List<Response> response){
            oneAdapter.setData(response);
        }

        @Override
        public void onDestroyView() {
            super.onDestroyView();
            unbinder.unbind();
        }

    }

1 Ответ

2 голосов
/ 13 марта 2019

Вы не можете вызвать метод фрагмента из другой Деятельности / Фрагмента.

У вас есть несколько способов решения этой проблемы

план A (рекомендуется)

Использование EventBus библиотека

1 : создайте EventClass.java вот так

public class EventClass{

    private List<FILL IT WITH YOUR OBJECT> populatedList;

    public EventClass(int populatedList) {
        this.populatedList= populatedList;
    }

    public int getPopulatedList() {
        return populatedList;
    }
}

2 : используйте его

в своей деятельности вместо этого

TabOne one = new TabOne()
one.getData(populatedList)

Используйте EventBus и опубликуйте ваше событие следующим образом

EventBus.getDefault().postSticky(new EventClass(populatedList));

3 Получите данные внутри фрагмента.Добавьте эту функцию к вашему фрагменту

@Subscribe
public void onEvent(EventClass event) {
     oneAdapter.setData(event.getPopulatedList());
}

4 не забудьте зарегистрировать и отменить регистрацию вашего EventBus в Fragmet

EventBus.getDefault().register(this);//add in onCreateView
//...
EventBus.getDefault().unregister(this);//add in onDestroyView

план B

Используйте дизайн интерфейса для обратного вызова во фрагменте.Вы должны создать интерфейс для данных изменений, таких как changingDataListener и implements, которые есть в вашем фрагменте , и вызвать callBack из Activity

plan C (Дополнительно)

Используйте RxJava с PublishSubject, вы можете создать Observable для наблюдений новых данных, а когда поступят новые данные, вы можете обновить свой адаптер.

ВЕРЬТЕ МНЕ План А намного проще!

...