RecyclerView: адаптер не подключен, пропуская макет (TabbedActivity + Firestore) - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь получить данные из магазина и отобразить их как RecyclerView в TabbedActivity. Данные отображаются на каждой вкладке / фрагменте, но иногда, если я проведу пальцем по вкладкам, а затем вернусь, данные исчезнут, и появится сообщение об ошибке «Нет подключенного адаптера, пропускающего макет».

Фрагмент. java

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.sligo_fragment, container, false);

    recyclerView = (RecyclerView) v.findViewById(R.id.sligo_recycler);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    return v;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    db.collection("sligo")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        placeNames.add(document.getData().get("Name").toString());
                    }
                    MyAdapter adapter = new MyAdapter(placeNames);
                    recyclerView.setAdapter(adapter);
                }
            });
}

MyAdapter. java

public static class MyViewHolder extends RecyclerView.ViewHolder{
    public TextView textView;
    public MyViewHolder(View itemView) {
        super(itemView);
        textView = itemView.findViewById(R.id.info_text);
    }
}

public MyAdapter(ArrayList<String> myDataset) {

    mDataset = myDataset;
}


@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // create a new view
    View v =  LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, parent, false);
    MyViewHolder vh = new MyViewHolder(v);
    return vh;

}

1 Ответ

1 голос
/ 18 февраля 2020

Согласно фрагменту LifeCycle onCreate вызывается раньше onCreateView. Кроме того, вы устанавливаете адаптер внутри асинхронной операции, которая требует времени для завершения. Попробуйте переместить код на onCreateView, как показано ниже:

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.sligo_fragment, container, false);

    recyclerView = (RecyclerView) v.findViewById(R.id.sligo_recycler);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    MyAdapter adapter = new MyAdapter(placeNames);
    recyclerView.setAdapter(adapter);

    db.collection("sligo")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        placeNames.add(document.getData().get("Name").toString());
                    }

                    adapter.notifyDataSetChanged();
                }
            });

    return v;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...