【问题标题】:error E/RecyclerView: No adapter attached; skipping layout when setting a firebase recyclerview android studio [duplicate]错误 E/RecyclerView:未连接适配器;设置firebase recyclerview android studio时跳过布局[重复]
【发布时间】:2020-07-15 07:05:51
【问题描述】:

我的 recyclerview 代码出现错误,这只是一个从 uid 数据库中检索孩子的简单代码,但它没有显示任何内容,我得到了这个 E/RecyclerView:未连接适配器;在我的 logcat 中跳过布局错误

这是我的 MainActivity

public class ProsesPesananActivity extends AppCompatActivity {

    DatabaseReference database;
    RecyclerView recyclerView;
    ArrayList<Status> list;
    StatusAdapter adapter;

    String uid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_proses_pesanan);

        final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
        uid = firebaseAuth.getUid();

        recyclerView = (RecyclerView) findViewById(R.id.list_proses);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        list = new ArrayList<Status>();

        database = FirebaseDatabase.getInstance().getReference().child("PasFoto").child(uid);
        database.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren())
                {
                    Status s = dataSnapshot.getValue(Status.class);
                    list.add(s);
                }
                adapter = new StatusAdapter(ProsesPesananActivity.this,list);
                recyclerView.setAdapter(adapter);

            }

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

                Toast.makeText(ProsesPesananActivity.this, "Error", Toast.LENGTH_SHORT).show();

            }
        });



        }

    }

这是我的适配器

public class StatusAdapter extends RecyclerView.Adapter<StatusAdapter.MyViewHolder> {

    Context context;
    ArrayList<Status> statuses;

    public StatusAdapter (Context c, ArrayList<Status> s){
        context = c;
        statuses = s;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_status,parent,false));
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.shopId.setText(statuses.get(position).getShopId());
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder
    {

        TextView shopId, ukuran, jumlah, total, status;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);

            shopId = (TextView) itemView.findViewById(R.id.tv_shopId);
            ukuran = (TextView) itemView.findViewById(R.id.tv_ukuran);
            jumlah= (TextView) itemView.findViewById(R.id.tvDetailJumlah);
            total = (TextView) itemView.findViewById(R.id.tv_total);
        }
    }
}

如您所见,我尝试使用卡片布局将数据从 firebase 检索到我的 recyclerview 中,但我什么也没得到

【问题讨论】:

  • 我应该在哪里写这些数据?对不起,我是新来的。
  • 在此之后recyclerView.setLayoutManager(new LinearLayoutManager(this));
  • 我写这个 setOrientation 的时候写不出来
  • 为什么?您在编写 setorientation 时遇到错误?
  • 不,只是我不会写,只是“红色”。

标签: java android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

没有连接适配器的错误就是这个意思。这可能是由ValueEventListener.onDataChange() 从未被调用引起的。

不过,更好的做法是预先设置适配器并通知适配器所做的任何更改。无论您的意图是什么,请确保至少调用一次ValueEventListener.onDataChange(),否则它可能无法按照您最初想要的方式工作。在这种情况下,请尝试研究ValueEventListener 的实际使用情况。

    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /* ... your code ... */
        list = new ArrayList<Status>();
        adapter = StatusAdapter(this, list);
        // Edit: Set adapter to RecyclerView`
        recyclerView = (RecyclerView) findViewById(R.id.list_proses);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
        database = FirebaseDatabase.getInstance().getReference().child("PasFoto").child(uid);
        database.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren())
                {
                    Status s = dataSnapshot.getValue(Status.class);
                    list.add(s);
                }
                adapter.notifyDataSetChanged();
            }

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

                Toast.makeText(ProsesPesananActivity.this, "Error", Toast.LENGTH_SHORT).show();
            }
        });
    }

此外,强烈推荐Jetpack Paging libraryRecyclerView 打交道,因为它可以节省数据和内存使用,尽管实施步骤有点不直接,但一旦你掌握了窍门,肯定会很有趣它。

【讨论】:

  • 还是说 E/RecyclerView: No adapter attach;两次跳过布局
  • @Kaine 道歉,错过了setAdapter() 部分。我已经添加了缺失的部分,请再次查看代码 sn-p。
  • StatusAdapter(this,s)中的s部分不能调用,需要声明。但是当我将它声明为一个数组时,它需要创建一个新的 StatusAdapter 并且我收到一个错误,说 Attempt to invoke virtual method 'int java.util.ArrayList.size()' on an null object reference
  • @Kaine 你必须先初始化你的数组列表。就像这样,list = new ArrayList&lt;Status&gt;(); 在一切之前。
  • 还是一样,你的代码中状态适配器中的 s 是红色的
猜你喜欢
  • 2020-02-03
  • 1970-01-01
  • 2020-03-12
  • 2023-03-02
  • 2021-01-11
  • 2021-08-29
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多