RecyclerView:未连接适配器;片段中跳过布局

时间:2019-08-20 04:11:31

标签: android android-recyclerview recycler-adapter

我发现了两个类似的问题,但没有一个起作用。我正在使用片段和RecyclerViews。控制台显示错误

  

E / RecyclerView:未连接适配器;跳过布局

https://i.stack.imgur.com/dxk8y.png适配器

https://i.stack.imgur.com/0J2io.png片段

   @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.listkos, null);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        User user = entries.get(position);

        holder.textViewTitle.setText(entries.get(position).getnmkos());
        holder.textViewShortDesc.setText(entries.get(position).getHp());
    }


    @Override
    public int getItemCount() {
        return entries.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        TextView textViewTitle, textViewShortDesc;
        ImageView imageView;

        public MyViewHolder(View itemView) {
            super(itemView);

            textViewTitle = itemView.findViewById(R.id.tvnm);
            textViewShortDesc = itemView.findViewById(R.id.tvhp);

        }
    }
}

这个片段

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

        database = FirebaseDatabase.getInstance().getReference("Users");
        firebaseAuth = FirebaseAuth.getInstance();
        firebaseUser = firebaseAuth.getCurrentUser();
         re = (RecyclerView) view.findViewById(R.id.recyle_buka);
        rvLayoutManager = new LinearLayoutManager(getActivity());
        re.setLayoutManager(rvLayoutManager);
        loadEntries();



        return view;
    }

    private void loadEntries(){
            database.child("Users").child(firebaseUser.getUid()).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                entries= new ArrayList<>();
                for (DataSnapshot noteDataSnapshot:dataSnapshot.getChildren()){
                  User user=noteDataSnapshot.getValue(User.class);
                  user.setKey(noteDataSnapshot.getKey());
                  entries.add(user);

                }
                    rvAdapter = new RvAdapter(entries) ;// This is still empty, probably
                    re.setAdapter(rvAdapter);
              }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Log.w("LogFragment", "loadLog:onCancelled", databaseError.toException());
                }
            });
         }
}

仍然无法正常工作 / *看起来您的帖子大部分是代码;请添加更多详细信息* /

3 个答案:

答案 0 :(得分:0)

您必须创建一个线性布局管理器。您必须将适配器设置为recyclerview。

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
re.setLayoutManager(linearLayoutManager);
YourAdapter yourAdapter = new YourAdapter(list);
re.setAdapter(yourAdapter);

答案 1 :(得分:0)

  

E / RecyclerView:未连接适配器;跳过布局

这表示您尚未将适配器连接到RecyclerView。因此,您需要使用空适配器初始化RecyclerView。像这样:

re = (RecyclerView) view.findViewById(R.id.recyle_buka);
rvLayoutManager = new LinearLayoutManager(getActivity());
re.setLayoutManager(rvLayoutManager);

// initialize empty adapter
entries= new ArrayList<>();
rvAdapter = new RvAdapter(entries);
re.setAdapter(rvAdapter);

然后,每当需要重新加载和刷新RecyclerView时,您都不应这样做

private void loadEntries(){

   ...

   entries= new ArrayList<>();
   for (DataSnapshot noteDataSnapshot:dataSnapshot.getChildren()){
      User user=noteDataSnapshot.getValue(User.class);
      user.setKey(noteDataSnapshot.getKey());
      entries.add(user);

   }

   // DON'T DO THIS!
   rvAdapter = new RvAdapter(entries) ;
   re.setAdapter(rvAdapter);

}

因为它使用新的适配器重置了适配器。

您需要刷新列表并通知适配器数据更改。

首先,将以下方法添加到您的适配器中以重新加载列表:

public void swap(List<User> list) {
   entries.clear();
   entries.addAll(list);
   notifyDataSetChanged();
}

然后将其添加到您的loadEntries()中。像这样:

private void loadEntries() {

   ...

   List<User> newEntries = new ArrayList<>();

   for (DataSnapshot noteDataSnapshot:dataSnapshot.getChildren()){
      User user=noteDataSnapshot.getValue(User.class);
      user.setKey(noteDataSnapshot.getKey());
      newEntries.add(user);

   }

   rvAdapter.swap(newEntries);

}

答案 2 :(得分:-1)

发生这种情况是因为您没有将布局管理器设置为Recyclerview。 请参阅下面的示例。

初始化recyclerview

technically

初始化您的适配器类

recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

现在将布局管理器设置为recyleview

mAdapter = new MoviesAdapter(movieList);