Firestore RecyclerView E/RecyclerView:没有连接适配器;跳过布局
Firestore RecyclerView E/RecyclerView: No adapter attached; skipping layout
我使用 Firestore RecyclerView 但我的列表没有显示,我的 logcat 说
E/RecyclerView: No adapter attached; skipping layout
以前,我为微调监听器制作了这个并且它有效,但是当我像在这段代码中那样制作时,它会导致错误并且不显示列表。
很抱歉重命名java.class
适配器的jurnaladapter
jurnal_sikap_adapter 型号 class
public class detail_siswa extends AppCompatActivity {
private FirebaseFirestore firebase;
private String documentid;
private String pre_pengetahuan,post_pengetahuan,sikap,keterampilan,deskripsi,designpattern,coverbuku,kelasid;
ArrayList<String> pretest,posttest;
ArrayList<Float> pretest_int,posttest_int;
private LineChart pretestgraph,posttestgraph;
private Double skorketerampilan,skordesignpattern,skorcover;
private TextView skoreterendah,skortertinggi,skorterendah2,skorterrtinggi2,designpatterntv,coverbukutv,ratatv,sikaptv;
private CollectionReference doc;
private RecyclerView recyclerViewx;
private jurnaladapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_siswa);
firebase = FirebaseFirestore.getInstance();
skoreterendah = findViewById(R.id.skorterendah);
skortertinggi = findViewById(R.id.skortertinggi);
skorterendah2 = findViewById(R.id.postskorterendah);
skorterrtinggi2 = findViewById(R.id.postskortertinggi);
designpatterntv = findViewById(R.id.designpatterntampil);
coverbukutv = findViewById(R.id.coverbukutampil);
ratatv = findViewById(R.id.rataratatampil);
sikaptv = findViewById(R.id.sikaptampil);
pretestgraph = (LineChart) findViewById(R.id.pretest_graph);
posttestgraph =(LineChart) findViewById(R.id.posttest_graph);
recyclerViewx = (RecyclerView) findViewById(R.id.recyclerview_jurnalsikapxml);
TextView textView = (TextView) findViewById(R.id.namasiswa_tampil);
Intent i = getIntent();
String nama = i.getStringExtra("nama");
kelasid = i.getStringExtra("kelasid");
textView.setText(nama +" : "+kelasid);
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerViewx.setLayoutManager(layoutManager);
firebase.collection("kelas").document(kelasid).collection("siswa").whereEqualTo("nama",nama)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful()) {
if (task.getResult().size() > 0) {
for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
documentid = documentSnapshot.getId();
kelas kelas = documentSnapshot.toObject(kelas.class);
pre_pengetahuan = kelas.getPre_pengetahuan();
post_pengetahuan = kelas.getPost_pengetahuan();
sikap = kelas.getSikap();
keterampilan = kelas.getKeterampilan();
deskripsi = kelas.getDeskripsi();
designpattern = kelas.getDesignpattern();
coverbuku = kelas.getCoverbuku();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
setuprecycleview();
}
});
convertntampil();
}
}
}
});
}
private void setuprecycleview() {
Query query = firebase.collection("kelas").document(kelasid).collection("siswa").document(documentid).collection("jurnalsikap").orderBy("butir", Query.Direction.ASCENDING);
FirestoreRecyclerOptions<jurnal_sikap_adapter> options = new FirestoreRecyclerOptions.Builder<jurnal_sikap_adapter>()
.setQuery(query, jurnal_sikap_adapter.class).build();
adapter = new jurnaladapter(options);
recyclerViewx.setHasFixedSize(true);
recyclerViewx.setAdapter(adapter);
adapter.startListening();
}
我编辑了我的适配器。也许我的适配器有问题:
public class jurnaladapter extends FirestoreRecyclerAdapter<jurnal_sikap_adapter, jurnaladapter.jurnalholder> {
/**
* Create a new RecyclerView adapter that listens to a Firestore Query. See {@link
* FirestoreRecyclerOptions} for configuration options.
*
* @param options
*/
public jurnaladapter(@NonNull FirestoreRecyclerOptions<jurnal_sikap_adapter> options) {
super(options);
}
@Override
protected void onBindViewHolder(@NonNull jurnalholder jurnalholder, int i, @NonNull jurnal_sikap_adapter jurnal_sikap_adapter) {
jurnalholder.catatantv.setText(jurnal_sikap_adapter.getCatatan());
jurnalholder.butirtv.setText(jurnal_sikap_adapter.getButir());
}
@NonNull
@Override
public jurnalholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.jurnal_sikap_model,parent,false);
return new jurnalholder(v);
}
class jurnalholder extends RecyclerView.ViewHolder{
TextView catatantv;
TextView butirtv;
public jurnalholder(@NonNull View itemView) {
super(itemView);
catatantv = (TextView) itemView.findViewById(R.id.catatansikap);
butirtv = (TextView) itemView.findViewById(R.id.butirSikap);
}
}
}
这是我的 Firestore
这是我的模特 class
您需要先将适配器设置为视图,然后才开始监听它:
adapter = new jurnaladapter(options);
recyclerViewx.setHasFixedSize(true);
recyclerViewx.setAdapter(adapter);
adapter.startListening();
可能是因为您从 firebase 实现的后台线程设置了适配器,您应该将适配器设置到主 UI 线程上的 recyclerview:
所以在 for 循环之后的查询回调中:
而不是这个:
......
......
setuprecycleview();
convertntampil();
.......
.......
这样做:
......
......
runOnUiThread(new Runnable(){
@Override
public void run(){
//call this on UI Thread
setuprecycleview();
}
});
convertntampil();
.....
....
更新:
好的,我假设您构建的查询不正确,您使用了两次 documentid。
这个:
Query query = firebase.collection("kelas").document(documentid).collection("siswa").document(documentid).collection("jurnalsikap").orderBy("butir", Query.Direction.ASCENDING);
我想一定是这样的:
Query query = firebase.collection("kelas").document(kelasid).collection("siswa").document(documentid).collection("jurnalsikap").orderBy("butir", Query.Direction.ASCENDING);
在将适配器设置为 RecyclerView
之前添加 startListening()
,如下所示:
private void setuprecycleview() {
Query query = firebase.collection("kelas").document(kelasid).collection("siswa").document(documentid).collection("jurnalsikap").orderBy("butir", Query.Direction.ASCENDING);
FirestoreRecyclerOptions<jurnal_sikap_adapter> options = new FirestoreRecyclerOptions.Builder<jurnal_sikap_adapter>()
.setQuery(query, jurnal_sikap_adapter.class).build();
adapter = new jurnaladapter(options);
recyclerViewx.setHasFixedSize(true);
adapter.startListening();
recyclerViewx.setAdapter(adapter);
}
我使用 Firestore RecyclerView 但我的列表没有显示,我的 logcat 说
E/RecyclerView: No adapter attached; skipping layout
以前,我为微调监听器制作了这个并且它有效,但是当我像在这段代码中那样制作时,它会导致错误并且不显示列表。
很抱歉重命名java.class
适配器的jurnaladapter jurnal_sikap_adapter 型号 class
public class detail_siswa extends AppCompatActivity {
private FirebaseFirestore firebase;
private String documentid;
private String pre_pengetahuan,post_pengetahuan,sikap,keterampilan,deskripsi,designpattern,coverbuku,kelasid;
ArrayList<String> pretest,posttest;
ArrayList<Float> pretest_int,posttest_int;
private LineChart pretestgraph,posttestgraph;
private Double skorketerampilan,skordesignpattern,skorcover;
private TextView skoreterendah,skortertinggi,skorterendah2,skorterrtinggi2,designpatterntv,coverbukutv,ratatv,sikaptv;
private CollectionReference doc;
private RecyclerView recyclerViewx;
private jurnaladapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_siswa);
firebase = FirebaseFirestore.getInstance();
skoreterendah = findViewById(R.id.skorterendah);
skortertinggi = findViewById(R.id.skortertinggi);
skorterendah2 = findViewById(R.id.postskorterendah);
skorterrtinggi2 = findViewById(R.id.postskortertinggi);
designpatterntv = findViewById(R.id.designpatterntampil);
coverbukutv = findViewById(R.id.coverbukutampil);
ratatv = findViewById(R.id.rataratatampil);
sikaptv = findViewById(R.id.sikaptampil);
pretestgraph = (LineChart) findViewById(R.id.pretest_graph);
posttestgraph =(LineChart) findViewById(R.id.posttest_graph);
recyclerViewx = (RecyclerView) findViewById(R.id.recyclerview_jurnalsikapxml);
TextView textView = (TextView) findViewById(R.id.namasiswa_tampil);
Intent i = getIntent();
String nama = i.getStringExtra("nama");
kelasid = i.getStringExtra("kelasid");
textView.setText(nama +" : "+kelasid);
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerViewx.setLayoutManager(layoutManager);
firebase.collection("kelas").document(kelasid).collection("siswa").whereEqualTo("nama",nama)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful()) {
if (task.getResult().size() > 0) {
for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
documentid = documentSnapshot.getId();
kelas kelas = documentSnapshot.toObject(kelas.class);
pre_pengetahuan = kelas.getPre_pengetahuan();
post_pengetahuan = kelas.getPost_pengetahuan();
sikap = kelas.getSikap();
keterampilan = kelas.getKeterampilan();
deskripsi = kelas.getDeskripsi();
designpattern = kelas.getDesignpattern();
coverbuku = kelas.getCoverbuku();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
setuprecycleview();
}
});
convertntampil();
}
}
}
});
}
private void setuprecycleview() {
Query query = firebase.collection("kelas").document(kelasid).collection("siswa").document(documentid).collection("jurnalsikap").orderBy("butir", Query.Direction.ASCENDING);
FirestoreRecyclerOptions<jurnal_sikap_adapter> options = new FirestoreRecyclerOptions.Builder<jurnal_sikap_adapter>()
.setQuery(query, jurnal_sikap_adapter.class).build();
adapter = new jurnaladapter(options);
recyclerViewx.setHasFixedSize(true);
recyclerViewx.setAdapter(adapter);
adapter.startListening();
}
我编辑了我的适配器。也许我的适配器有问题:
public class jurnaladapter extends FirestoreRecyclerAdapter<jurnal_sikap_adapter, jurnaladapter.jurnalholder> {
/**
* Create a new RecyclerView adapter that listens to a Firestore Query. See {@link
* FirestoreRecyclerOptions} for configuration options.
*
* @param options
*/
public jurnaladapter(@NonNull FirestoreRecyclerOptions<jurnal_sikap_adapter> options) {
super(options);
}
@Override
protected void onBindViewHolder(@NonNull jurnalholder jurnalholder, int i, @NonNull jurnal_sikap_adapter jurnal_sikap_adapter) {
jurnalholder.catatantv.setText(jurnal_sikap_adapter.getCatatan());
jurnalholder.butirtv.setText(jurnal_sikap_adapter.getButir());
}
@NonNull
@Override
public jurnalholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.jurnal_sikap_model,parent,false);
return new jurnalholder(v);
}
class jurnalholder extends RecyclerView.ViewHolder{
TextView catatantv;
TextView butirtv;
public jurnalholder(@NonNull View itemView) {
super(itemView);
catatantv = (TextView) itemView.findViewById(R.id.catatansikap);
butirtv = (TextView) itemView.findViewById(R.id.butirSikap);
}
}
}
这是我的 Firestore
您需要先将适配器设置为视图,然后才开始监听它:
adapter = new jurnaladapter(options);
recyclerViewx.setHasFixedSize(true);
recyclerViewx.setAdapter(adapter);
adapter.startListening();
可能是因为您从 firebase 实现的后台线程设置了适配器,您应该将适配器设置到主 UI 线程上的 recyclerview:
所以在 for 循环之后的查询回调中:
而不是这个:
......
......
setuprecycleview();
convertntampil();
.......
.......
这样做:
......
......
runOnUiThread(new Runnable(){
@Override
public void run(){
//call this on UI Thread
setuprecycleview();
}
});
convertntampil();
.....
....
更新:
好的,我假设您构建的查询不正确,您使用了两次 documentid。
这个:
Query query = firebase.collection("kelas").document(documentid).collection("siswa").document(documentid).collection("jurnalsikap").orderBy("butir", Query.Direction.ASCENDING);
我想一定是这样的:
Query query = firebase.collection("kelas").document(kelasid).collection("siswa").document(documentid).collection("jurnalsikap").orderBy("butir", Query.Direction.ASCENDING);
在将适配器设置为 RecyclerView
之前添加 startListening()
,如下所示:
private void setuprecycleview() {
Query query = firebase.collection("kelas").document(kelasid).collection("siswa").document(documentid).collection("jurnalsikap").orderBy("butir", Query.Direction.ASCENDING);
FirestoreRecyclerOptions<jurnal_sikap_adapter> options = new FirestoreRecyclerOptions.Builder<jurnal_sikap_adapter>()
.setQuery(query, jurnal_sikap_adapter.class).build();
adapter = new jurnaladapter(options);
recyclerViewx.setHasFixedSize(true);
adapter.startListening();
recyclerViewx.setAdapter(adapter);
}