试图在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附加了适配器。那为什么我一直收到这个错误?
我已经阅读了与同一问题相关的其他问题,但没有任何帮助。
答案 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();
}
});