【问题标题】:RecyclerView: No adapter attached - why do I keep getting this error?RecyclerView:未连接适配器 - 为什么我不断收到此错误?
【发布时间】:2018-03-09 00:12:07
【问题描述】:

只是想在 RecyclerView 中显示我数据库中的信息。 一切正常。显示对象。

但是 logcat 说:

E/RecyclerView:没有附加适配器;跳过布局

这是我的代码 (DisplayImages.java)

    public class DisplayImages extends AppCompatActivity {
    DatabaseReference databaseReference;

    RecyclerView recyclerView;

    RecyclerView.Adapter adapter;
    ProgressDialog progressDialog;

    List<ImageUploadInfo> list = new ArrayList<>();

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

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

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(DisplayImages.this));

        progressDialog = new ProgressDialog(DisplayImages.this);
        progressDialog.setMessage("Loading Images From Firebase.");
        progressDialog.show();

        // Setting up Firebase image upload folder path in databaseReference.
        // The path is already defined in MainActivity.
        databaseReference = FirebaseDatabase.getInstance().getReference(Main.Database_Path);

        databaseReference.addValueEventListener(new ValueEventListener() {
            @override
            public void onDataChange(DataSnapshot snapshot) {

                for (DataSnapshot postSnapshot : snapshot.getChildren()) {

                    ImageUploadInfo imageUploadInfo = postSnapshot.getValue(ImageUploadInfo.class);

                    list.add(imageUploadInfo);
                }

                adapter = new RecyclerViewAdapter(getApplicationContext(), list);

                recyclerView.setAdapter(adapter);
                progressDialog.dismiss();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

                progressDialog.dismiss();

            }
        });

    }

如果有什么不同,这就是我在 MainActivity 中写的关于 DataBase_Path 的内容:

public class Main extends AppCompatActivity implements View.OnClickListener {

DatabaseReference databaseReference;
public static final String Database_Path = "All_Image_Uploads_Database";

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

    databaseReference = FirebaseDatabase.getInstance().getReference(Database_Path);

如您所见,我为 Recycleview 附加了一个适配器。那为什么我总是收到这个错误?

我已阅读与同一问题相关的其他问题,但没有任何帮助。

【问题讨论】:

  • 要获得警告,将设置适配器部分移到异步方法上方,并仅在异步方法中更新适配器的数据
  • @Anne 正如上面的评论所说,您应该在创建布局后将适配器的创建移到右侧。然后,您可以设置一个空列表,当您返回 firebase 时,您可以在适配器上更新列表和 notifyDatasetChanged()。我已经编辑了我的答案以更好地解释:)

标签: android c android-studio android-recyclerview


【解决方案1】:

您需要在设置布局管理器之后设置适配器,否则您将收到您所看到的错误消息。

recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
//don't set adapter here
    recyclerView.setLayoutManager(new LinearLayoutManager(DisplayImages.this));

//set adapter here

此外,您可以先使用空列表设置适配器,然后当您收到来自 firebase 的回调时,您可以更新列表并在适配器上调用 notifyDatasetChanged()。您看到的问题是由于您直到过程的后期才真正设置适配器(当您的 firebase 调用返回时)

像这样:

recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(DisplayImages.this));
adapter = new RecyclerViewAdapter(getApplicationContext(), list);
 recyclerView.setAdapter(adapter);


databaseReference.addValueEventListener(new ValueEventListener() {
            @override
            public void onDataChange(DataSnapshot snapshot) {

                for (DataSnapshot postSnapshot : snapshot.getChildren()) {

                    ImageUploadInfo imageUploadInfo = postSnapshot.getValue(ImageUploadInfo.class);

                    list.add(imageUploadInfo);
                }
               adapter.notifyDatasetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

                progressDialog.dismiss();

            }
        });

【讨论】:

  • 我不明白我应该在以下行中更改什么:'RecyclerView.Adapter adapter;' .我想显示一个 Imageview 和一个 textview
  • 对不起安妮,那是在我看到你的完整代码之前。我认为如果您只是将创建移到 firebase 调用之前,错误可能会消失。
  • firease中的inf没有显示,但至少错误消失了!!!!!!谢谢!!♥
  • 很高兴它有帮助:)
【解决方案2】:

我没有看到您正在创建适配器并将该适配器设置为RecyclerView。您需要创建一个适配器并设置适配器,如下所示:

mAppAdapter = new AppAdapter(mModel); // or whatever constructor you want
recyclerView.setAdapter(mAppAdapter);

编辑:

您在异步方法中将适配器设置为RecyclerView。因此,您的程序将有一段不确定的时间,适配器实际上并未设置为recyclerView。为了摆脱你得到的警告,你应该初始化并将适配器设置在异步方法之上,并且只在异步方法内更新适配器的数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多