Android Firebase Recyclerview适配器未填充数据-mSnapshots为0



嗨,我不确定我的FirebaseRecycler哪里出了问题——我在运行或logcat中都没有出现错误。我刚刚得到一个空白活动,调试器输出显示FirebaseRecyclerOptions mSnapshot数组的大小为0。任何帮助都会很棒!

以下是firebase数据的外观:火球数据

logcat输出:logcat图像

调试器输出:调试映像(断点设置在MainActivity onCreate方法的最后一行(

主要活动:

public class MainActivity extends AppCompatActivity {
RecyclerView recview;
Adapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recview = (RecyclerView)findViewById(R.id.recview);

FirebaseRecyclerOptions<Podcast> options =
new FirebaseRecyclerOptions.Builder<Podcast>()
.setQuery(FirebaseDatabase.getInstance().getReference().child("top10"),Podcast.class)
.build();
adapter = new Adapter(options);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this,1,GridLayoutManager.VERTICAL,false);
recview.setLayoutManager(gridLayoutManager);
recview.setAdapter(adapter);
}
@Override
protected void onStart() {
super.onStart();
adapter.startListening();
}
@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}}

这是我正在使用的名为Podcasts:的模型类

public class Podcast {
private String rss;
private String title;
private Integer order;
public Podcast(){
}
public Podcast(String url, String title, Integer order){
this.rss = url;
this.title = title;
this.order = order;
}
public String getTitle(){
return title;
}
public String getRss(){
return rss;
}
public Integer getOrder(){
return order;
}
public void setTitle(String title) {this.title = title;}
public void setRss(String rss){this.rss = rss;}
public void setOrder(Integer order){this.order = order;}}

这是适配器类:

public class Adapter extends FirebaseRecyclerAdapter<Podcast,Adapter.myviewholder> {
LayoutInflater inflater;
//constructor
public Adapter(@NonNull FirebaseRecyclerOptions<Podcast> options){
super(options);
//inherits titles and url from the Podcast class
}
@Override
protected void onBindViewHolder(@NonNull myviewholder holder, int position, @NonNull Podcast model) {
holder.name.setText(model.getTitle());      //model is the podcast object
holder.url.setText(model.getRss());
holder.order.setText(model.getOrder());
//image with picasso next
}
@NonNull
@Override
public myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.custom_grid_layout,parent,false);
return new myviewholder(view);
}
public static class myviewholder extends RecyclerView.ViewHolder
{
TextView name;
TextView url;
TextView order;
public myviewholder(@NonNull View itemView)
{
super(itemView);
name = (TextView)itemView.findViewById(R.id.textView2);
url = (TextView)itemView.findViewById(R.id.url);
order = (TextView)itemView.findViewById(R.id.order);
}
}}

activity_main.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=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recview"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteX="306dp"
tools:layout_editor_absoluteY="397dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

custom_gridview_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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="wrap_content"
android:layout_height="wrap_content">
<androidx.cardview.widget.CardView
android:id="@+id/cardView"
android:layout_width="wrap_content"
android:layout_height="159dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="52dp"
app:cardPreventCornerOverlap="true"
app:contentPadding="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="328dp"
android:layout_height="127dp">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="43dp"
android:layout_marginLeft="43dp"
android:layout_marginEnd="44dp"
android:layout_marginRight="44dp"
android:layout_marginBottom="16dp"
android:paddingRight="10dp"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="132dp"
android:layout_marginLeft="132dp"
android:layout_marginEnd="138dp"
android:layout_marginRight="138dp"
android:layout_marginBottom="13dp"
android:text="TextView"
app:layout_constraintBottom_toTopOf="@+id/textView2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/order"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="130dp"
android:layout_marginLeft="130dp"
android:layout_marginTop="30dp"
android:layout_marginEnd="140dp"
android:layout_marginRight="140dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</RelativeLayout>

在数据库中,当您获得Reference时,它将获得"testapi-232613-defa"并且呼叫child将带来密钥";1vertHC2Qy"而不是";top10";这就是为什么它无法获得任何数据

嗨,原来这个问题与适配器需要为充气机进行类型转换有关:

旧:view = inflater.inflate(R.layout.custom_grid_layout,parent,false);

新:View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_grid_layout,parent,false)

此外,我还将数据库引用更改为:

DatabaseReference myRef = database.getReferenceFromUrl("https://testapi-232613-default-rtdb.firebaseio.com/1wertHC2QykkMJPdc6aPgV1pasPB8mFpkOyuuCRk1kE0/top10");

并将其用作setQuery((函数的参数

您应该将数据库首选项更改为

DatabaseReference myRef=数据库.getReferenceFromUrl(";https://testapi-232613-default-rtdb.firebaseio.com/1wertHC2QykkMJPdc6aPgV1pasPB8mFpkOyuuCRk1kE0/top10"(;

一定要看看。

最新更新