【问题标题】:Firestore RecyclerView E/RecyclerView: No adapter attached; skipping layoutFirestore RecyclerView E/RecyclerView:未连接适配器;跳过布局
【发布时间】:2020-05-14 00:49:40
【问题描述】:

我使用 Firestore RecyclerView,但我的列表没有显示,我的 logcat 显示

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

以前,我为微调器侦听器制作了这个并且它可以工作,但是当我在这段代码中制作它时,它会导致错误并且不显示列表。

我很抱歉重命名 java.class

junnaladapter 用于适配器 模型类的jurnal_sikap_adapter

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

这是我的火库 这是我的模型课

【问题讨论】:

    标签: android android-recyclerview google-cloud-firestore firebaseui


    【解决方案1】:

    在将适配器设置为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);
    
    }
    

    【讨论】:

    • @AiHaQ 你能把 runOnUi 去掉吗...然后打电话给setuprecycleview();
    • 我删除了它,但没有任何变化
    • 我尝试在不需要 documentid(仅用于尝试)集合(“jurnalsikap”)的地方进行新查询,我认为 FirestoreRecyclerOptions 可能在 oncomplete 内不起作用,结果没有错误没有附加适配器,但是它仍然没有显示和这样的错误 E/DecorView: mWindow.mActivityCurrentConfig is null
    • 它显示 E/RecyclerView:未连接适配器;当我将 setuprecycleview() 放入 oncomplete 时跳过布局
    【解决方案2】:

    您需要先将适配器设置为视图,然后才开始监听它:

    adapter = new jurnaladapter(options);
    recyclerViewx.setHasFixedSize(true);
    recyclerViewx.setAdapter(adapter);
    adapter.startListening();
    

    【讨论】:

    • 很抱歉,它仍然显示相同的错误 ` E/RecyclerView: No adapter attach;跳过布局`
    【解决方案3】:

    可能是因为您从由 firebase 实现的后台线程设置适配器,您可能应该将适配器设置为主 UI 线程上的 recyclerview:

    所以在 for 循环之后的 Query 回调中:

    而不是这个:

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

    【讨论】:

    • 在 for 循环之后,你按照我说的做了吗?
    • 显示数据库的屏幕截图并公开所有内容。
    • 您没有显示所有数据库,您可以为之前的集合和文档添加另一个屏幕截图。
    • 我在查询中出错..在第一个文档中我应该插入 kelasid 变量,我改变它知道错误 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context .getSystemService(java.lang.String)' 在空对象引用上
    • 你的 kelasid 是如何无效的?
    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2020-02-03
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多