RecyclerView:没有附加适配器 - 为什么我一直收到此错误?

时间:2018-03-09 00:12:08

标签: android c android-studio android-recyclerview

试图在RecyclerView中显示我的数据库中的信息。 一切正常。显示对象。

但是logcat说:

E/RecyclerView: No adapter attached; skipping layout

这是我的代码(DisplayImages.java)

-waitUntilExit

如果它有任何区别,这就是我在MainActivity中写的关于DataBase_Path的内容:

    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();

            }
        });

    }

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

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

2 个答案:

答案 0 :(得分:0)

我无法在任何地方看到您正在创建适配器并将该适配器设置为RecyclerView。您需要创建一个适配器并设置如下的适配器:

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

编辑:

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

答案 1 :(得分:0)

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

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();

            }
        });