【问题标题】:Retriving data from firebase to populate a RecyclerView从 firebase 检索数据以填充 RecyclerView
【发布时间】:2018-08-29 20:34:57
【问题描述】:

我想从 FireBase 检索一些数据以填充 RecyclerView。我的应用想法是:用户从地图片段中选择一些位置,然后将它们存储在 Firebase 数据库中。这些保存的位置显示在 Places 片段中我想使用 RecylcerView。当我运行应用程序时,我收到以下错误

08-29 23:01:35.257 25039-25039/com.aplicatiechat.mcristi.firebaseandmapsdemoforlearning E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.aplicatiechat.mcristi.firebaseandmapsdemoforlearning, PID: 25039
    com.google.firebase.database.DatabaseException: Class com.aplicatiechat.mcristi.firebaseandmapsdemoforlearning.Places is missing a constructor with no arguments
        at com.google.android.gms.internal.zzekq.zze(Unknown Source)
        at com.google.android.gms.internal.zzekp.zzb(Unknown Source)
        at com.google.android.gms.internal.zzekp.zza(Unknown Source)
        at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
        at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:22)
        at com.firebase.ui.database.ObservableSnapshotArray.getObject(ObservableSnapshotArray.java:141)
        at com.firebase.ui.database.CachingObservableSnapshotArray.getObject(CachingObservableSnapshotArray.java:40)
        at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:127)
        at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:164)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
        at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1767)
        at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:356)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
        at android.view.Choreographer.doCallbacks(Choreographer.java:590)
        at android.view.Choreographer.doFrame(Choreographer.java:559)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5951)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)

这是我的地方片段:

 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mView = inflater.inflate(R.layout.places_fragment, container, false);
        mRecylcerView = mView.findViewById(R.id.places);
        mRecylcerView.setHasFixedSize(true);
        mRecylcerView.setLayoutManager(new LinearLayoutManager(getContext()));

        return mView;

    }

    @Override
    public void onStart() {
        super.onStart();
        mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        mDataBase = FirebaseDatabase.getInstance().getReference().child("users").child(mFirebaseUser.getUid());
        DatabaseReference places = FirebaseDatabase.getInstance().getReference().child("users").child(mFirebaseUser.getUid()).child("place");
        DatabaseReference keys = FirebaseDatabase.getInstance().getReference().child("users").child(mFirebaseUser.getUid()).child("key");
        FirebaseIndexRecyclerAdapter<Places,PlacesViewHolder> firebaseRecyclerAdapter = new FirebaseIndexRecyclerAdapter<Places,PlacesViewHolder>(Places.class,R.layout.place_layout,PlacesViewHolder.class,places,keys) {
            @Override
            protected void populateViewHolder(PlacesViewHolder viewHolder, Places model, int position) {
                viewHolder.setLat(model.getLat());
                viewHolder.setLon(model.getLon());
            }
        };
        mRecylcerView.setAdapter(firebaseRecyclerAdapter);
    }

}
class PlacesViewHolder extends RecyclerView.ViewHolder{
    View mView;
    private TextView lat;
    private TextView lon;


    public PlacesViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        lat = mView.findViewById(R.id.lat_view);
        lon = mView.findViewById(R.id.lon_view);
    }

    public void setLat(String n){
        lat.setText(n);
    }

    public void setLon(String e){
        lon.setText(e);
    }
}

这是我的 Model Places 课程:

public class Places extends RecyclerView.ViewHolder {
    private String lat;
    private String lon;

    public Places(View itemView) {
        super(itemView);
    }


    public String getLat() {
        return lat;
    }

    public void setLat(String lat) {
        this.lat = lat;
    }

    public String getLon() {
        return lon;
    }

    public void setLon(String lon) {
        this.lon = lon;
    }

}

这是我的数据库的屏幕显示: Firebase database

【问题讨论】:

    标签: android firebase android-recyclerview


    【解决方案1】:

    Places 类中添加一个空构造函数

    public Places(){}
    

    因为 firebase 回收器适配器在您的 Places 类中没有找到这个空的构造函数。并替换这个

    FirebaseIndexRecyclerAdapter<Places,PlacesViewHolder> firebaseRecyclerAdapter = new FirebaseIndexRecyclerAdapter<Places,PlacesViewHolder>(Places.class,R.layout.place_layout,PlacesViewHolder.class,places,keys)
    

    FirebaseIndexRecyclerAdapter<Places,PlacesViewHolder> firebaseRecyclerAdapter = new FirebaseIndexRecyclerAdapter<Places,PlacesViewHolder>(Places.class,R.layout.place_layout,PlacesViewHolder.class,keys,places) {
    

    您需要从 Places 类中删除扩展。

    【讨论】:

    • 尝试实现空构造函数时出现错误:“默认构造函数在 android.support.v7.widget.RecyclerView 中不可用;”
    • 为什么需要使用 RecyclerView.ViewHolder 扩展 Places ?这是多余的
    • 我删除了扩展的 RecyclerView.ViewHolder 但异常仍然存在。
    • 去掉extend后,出现了一个空的构造函数,但问题依然存在?
    • " com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.aplicatiechat.mcristi.firebaseandmapsdemoforlearning.Places" 还是一样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2021-09-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2018-01-19
    • 2018-03-12
    相关资源
    最近更新 更多