安卓工作室recyclerview firebase不显示数据。

问题描述 投票:1回答:1

我正在尝试使用Firebase数据库和recyclerview来建立Android图书商店项目来显示我的数据。但问题是,当我运行我的应用程序时,我有空的活动,没有任何错误。

RecyclerViewActivity java.Activity_recycler_view xml:

package sky.ex.ai.booksstore;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

public class RecyclerViewActivity extends AppCompatActivity {

    RecyclerView rviwe;
    ArrayList<BookDetails> plist;
    ItemAdapter itemAdapter;
    FirebaseDatabase fb;
    DatabaseReference ref;


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

        rviwe = findViewById(R.id.recycler_view);
        plist = new ArrayList<BookDetails>();
        fb = FirebaseDatabase.getInstance();
        ref = fb.getReference("Library");

        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot ds:dataSnapshot.getChildren()){

                    BookDetails p = ds.getValue(BookDetails.class);
                    plist.add(new BookDetails(p.bkname,p.bkAuthor));

                    Log.i("THE_CURRENT_USER:::", p.toString());
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }


        });
        LinearLayoutManager im = new LinearLayoutManager((this));
        rviwe.setLayoutManager(im);
        itemAdapter = new ItemAdapter(plist);
        rviwe.setAdapter(itemAdapter);

    }
}

活动_recycler_view xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".RecyclerViewActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

项目布局xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="138dp"
        android:layout_height="59dp"
        android:layout_weight="1"
        app:srcCompat="@drawable/book" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:paddingLeft="10dp">

        <TextView
            android:id="@+id/book_name_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Book name" />

        <TextView
            android:id="@+id/book_author_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Book Author" />

        <TextView
            android:id="@+id/book_price_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Book price" />
    </LinearLayout>
</LinearLayout>

书籍内容类

package sky.ex.ai.booksstore;

    public class BookDetails {

       String bkAuthor;
       String bkname;

        public BookDetails() {
        }

       public BookDetails(String bkname, String bkAuthor){
           this.bkAuthor = bkAuthor;
           this.bkname = bkname;
       }

        public String getBkAuthor() {
            return bkAuthor;
        }

        public void setBkAuthor(String bkAuthor) {
            this.bkAuthor = bkAuthor;
        }

        public String getBkname() {
            return bkname;
        }

        public void setBkname(String bkname) {
            this.bkname = bkname;
        }
    }

项目适配器java

package sky.ex.ai.booksstore
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {

    public ArrayList<BookDetails> itemlist;

    public ItemAdapter(ArrayList<BookDetails> itemlist) {
        this.itemlist = itemlist;
    }


    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater
                .from(viewGroup.getContext()).inflate(R.layout.item_layot,viewGroup, false);
        ViewHolder vh = new ViewHolder(view);
        return vh;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
        holder.txt_pname.setText("Book Name :" +itemlist.get(i).bkname);
        holder.txt_pid.setText("Book Author :" +itemlist.get(i).bkAuthor);
    }

    @Override
    public int getItemCount() {
        if (itemlist==null)
            return 0;
        else  return itemlist.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        public ImageButton imgb1;
        public TextView txt_pid,txt_pname,txt_pric;


        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            txt_pid = itemView.findViewById(R.id.book_name_list);
            txt_pname = itemView.findViewById(R.id.book_author_list);
        }
    }


}

数据库结构

enter image description here

任何想法,请?

java android android-recyclerview
1个回答
2
投票

由于你调用的是异步方法。适配器被设置为空的plist。你需要在回调方法onDataChange里面设置项目,然后在适配器上调用notifyDatasetChanged来通知它新数据的可用性。可能需要修正一些编译器的抱怨,但这应该能让你接近。

ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot ds:dataSnapshot.getChildren()){
                    BookDetails p = ds.getValue(BookDetails.class);
                    plist.add(new BookDetails(p.bkname,p.bkAuthor));
                    Log.i("THE_CURRENT_USER:::", p.toString());
                }
                LinearLayoutManager im = new LinearLayoutManager((RecyclerViewActivity.this));
                rviwe.setLayoutManager(im);
                itemAdapter = new ItemAdapter(plist);
                rviwe.setAdapter(itemAdapter);
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });

2
投票

获取数据后,调用 notifyDataSetChanged() 适配器上

    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds:dataSnapshot.getChildren()){

                BookDetails p = ds.getValue(BookDetails.class);
                plist.add(new BookDetails(p.bkname,p.bkAuthor));

                Log.i("THE_CURRENT_USER:::", p.toString());
            }
        itemAdapter.notifyDataSetChanged();   
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
© www.soinside.com 2019 - 2024. All rights reserved.