E / RecyclerView: адаптер не подключен; пропуская макет на рециркуляторе внутри фрагмента - PullRequest
0 голосов
/ 29 марта 2020

У меня появляется сообщение об ошибке «E / RecyclerView: адаптер не подключен; пропуск макета». У меня есть recycleView внутри фрагмента, поэтому я должен был сделать что-то не так на фрагменте 1. java.

вот код. Я установил адаптер на код, как вы можете видеть, но я получаю эту ошибку. Любая помощь будет оценена. Спасибо.

publi c класс Fragment1 extends Fragment {

private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private ArrayList<Bible> arrayList;
private FirebaseDatabase database;
private DatabaseReference databaseReference;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment1, container, false);

    recyclerView = rootView.findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    //GridLayoutManager layoutManager = new GridLayoutManager(getContext(),  2);
    layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
    recyclerView.setLayoutManager(layoutManager);


    arrayList = new ArrayList<>();

    database = FirebaseDatabase.getInstance();
    databaseReference = database.getReference("Bible");

    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            arrayList.clear();
            for(DataSnapshot snapshot: dataSnapshot.getChildren()){
                Bible bible = snapshot.getValue(Bible.class);
                arrayList.add(bible);

            }
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

            Log.e("fragment1", String.valueOf(databaseError.toException()));//에러문 출력
        }
    });

    adapter = new BibleAdapter(arrayList, getContext());
    recyclerView.setAdapter(adapter);






    return rootView;
}

}

publi c класс BibleAdapter расширяет RecyclerView.Adapter {

private  ArrayList<Bible> arrayList;
private  Context context;
private OnVerseItemClickListener listener;

public BibleAdapter(ArrayList<Bible> arrayList, Context context) {
    this.arrayList = arrayList;
    this.context = context;
}

public void setOnItemClickListener(OnVerseItemClickListener listener){
    this.listener = listener;
}

@NonNull
@Override
public BibleAdapter.BibleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.verse_item, parent, false);
    BibleViewHolder holder = new BibleViewHolder(view, listener);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull BibleAdapter.BibleViewHolder holder, int position) {
    Glide.with(holder.imageView)
            .load(arrayList.get(position).getImage())
            .into(holder.imageView);
    holder.bibleType.setText(arrayList.get(position).getBibleType());
    holder.keysentance.setText(arrayList.get(position).getKeysentance());
    holder.verse.setText(arrayList.get(position).getVerse());

}

@Override
public int getItemCount() {
    return (arrayList!=null? arrayList.size():0);
}

public class BibleViewHolder extends RecyclerView.ViewHolder{

    ImageView imageView;
    TextView bibleType;
    TextView verse;
    TextView keysentance;

    public BibleViewHolder(@NonNull View itemView, final OnVerseItemClickListener listener) {
        super(itemView);
        this.imageView = itemView.findViewById(R.id.imageView);
        this.bibleType = itemView.findViewById(R.id.bibleType);
        this.keysentance = itemView.findViewById(R.id.keysentance);
        this.verse = itemView.findViewById(R.id.verse);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = getAdapterPosition();
                if(listener != null){
                    listener.onItemClick(BibleViewHolder.this, v, position);
                }
            }
        });
    }
}

}

1 Ответ

0 голосов
/ 29 марта 2020

в вашем коде вы создаете адаптер с пустым arrayList, но никогда после этого вы не обновляете список.

в адаптере создает метод swapData () и вызывает его, когда вам нужно обновить данные sh или иметь обновив данные, в вашем случае вы получите их в onDataChange ().

, а также определите адаптер перед добавлением прослушивателя:

adapter = new BibleAdapter(arrayList, getContext());
        recyclerView.setAdapter(adapter);

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                arrayList.clear();
                for(DataSnapshot snapshot: dataSnapshot.getChildren()){
                    Bible bible = snapshot.getValue(Bible.class);
                    arrayList.add(bible);
                }
                  adapter.swapData(arrayList);
                //adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

                Log.e("fragment1", String.valueOf(databaseError.toException()));//에러문 출력
            }
        });

в методе создания класса адаптера как:

public void swapData(ArrayList<Bible> filtersList) {
    if (filtersList != null) {
        this.arrayList.clear();
        this.arrayList.addAll(filtersList);
        notifyDataSetChanged();
    }
}
...