首页 > 解决方案 > E/RecyclerView:没有附加适配器;在片段内的recyclerview上跳过布局

问题描述

我有“E/RecyclerView:未连接适配器;跳过布局”错误消息。我在片段中有recycleView,所以我一定在fragment1.java 上做错了什么。

这是代码。如您所见,我在代码上设置了适配器,但出现此错误。任何帮助,将不胜感激。谢谢你。

公共类 Fragment1 扩展 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;
}

}

公共类 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);
                }
            }
        });
    }
}

}

标签: androidandroid-recyclerviewfragment

解决方案


在您的代码中,您创建了带有空arrayList 的适配器,但之后您永远不会更新列表。

在适配器中创建 swapData() 方法并在您必须刷新数据或已刷新数据时调用它,在您的情况下,您将在 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();
    }
}

推荐阅读