【问题标题】:Error while showing data from Firebase using RecyclerView [duplicate]使用 RecyclerView 显示来自 Firebase 的数据时出错 [重复]
【发布时间】:2018-05-21 12:05:09
【问题描述】:
            (Blog.class,R.layout.venue_row,BlogViewHolder.class,mDatabase) {

这一行在onStart() 中显示错误。 在这里,我发布了错误消息的屏幕截图。 Please check this once.

错误出现在 Activity.java 文件 onStart() {...} (Blog.class,R.layout.venue_row,BlogViewHolder.class,mDatabase) {

Activity.java

package com.cornicore.icccricketworldcup2019;

import android.content.Context;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.squareup.picasso.Picasso;
public class VenuesActivity extends AppCompatActivity {

    private RecyclerView mBlogList;
    private DatabaseReference mDatabase;


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


        mDatabase = FirebaseDatabase.getInstance().getReference().child("Venues");
        mDatabase.keepSynced(true);
        mBlogList = (RecyclerView) findViewById(R.id.myrecyclerview);
        mBlogList.setHasFixedSize(true);
        mBlogList.setLayoutManager(new LinearLayoutManager(this));



    }

    @Override
    protected void onStart() {
        super.onStart();
        FirebaseRecyclerAdapter<Blog,BlogViewHolder,>firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>
                (Blog.class,R.layout.venue_row,BlogViewHolder.class,mDatabase) {
            @Override
            protected void onBindViewHolder(@NonNull BlogViewHolder holder, int position, @NonNull Blog model) {

            }

            @NonNull
            @Override
            public BlogViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                return null;
            }
        };

        mBlogList.setAdapter(firebaseRecyclerAdapter);

    }

    public static class BlogViewHolder extends RecyclerView.ViewHolder{
        View mView;
        public BlogViewHolder(View itemView){
            super(itemView);
            mView = itemView;
        }
        public void setTitle(String title){
            TextView post_title = (TextView) mView.findViewById(R.id.post_title);
            post_title.setText(title);
        }
        public void setDesc(String desc){
            TextView post_desc = (TextView) mView.findViewById(R.id.post_desc);
            post_desc.setText(desc);
        }
        public void setImage(Context ctx, String image){
            ImageView post_Image = (ImageView) mView.findViewById(R.id.post_image);
            Picasso.with(ctx).load(image).into(post_Image);
        }
    }

}

activity.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="match_parent"
    android:layout_height="match_parent"
    tools:context=".VenuesActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/myrecyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>

</RelativeLayout>

博客.java

package com.cornicore.icccricketworldcup2019;

public class Blog {

    private String title;
    private String desc;
    private String image;

    public Blog(String title, String desc, String image) {
        this.title = title;
        this.desc = desc;
        this.image = image;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }
    public Blog(){

    }

}

venue_row.xml(将recyclerview显示为cardview)

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView 
xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_margin="7dp"
    app:cardCornerRadius="12dp"
    android:elevation="90dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="248dp"
        android:orientation="vertical"
        android:background="#121111">

        <ImageView
            android:id="@+id/post_image"
            android:layout_width="match_parent"
            android:layout_height="180dp"
            android:scaleType="centerCrop"/>

        <TextView
            android:id="@+id/post_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20dp"
            android:text="POST TITLE"
            android:textColor="#fff"/>

        <TextView
            android:id="@+id/post_desc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="POST DESC"
            android:textColor="#fff"/>


    </LinearLayout>



</android.support.v7.widget.CardView>

【问题讨论】:

标签: android firebase firebase-realtime-database firebaseui


【解决方案1】:

在此处查看文档: FirebaseUI-Readme

他们改变了 FirebaseRecyclerAdapter 的设置方式。现在您需要使用 FirebaseRecyclerOptions 来配置您的 FirebaseRecyclerAdapter

【讨论】:

    【解决方案2】:

    您收到该错误是因为您向构造函数传递了错误的数字和错误类型的参数。为了使其工作,您需要将FirebaseRecyclerOptions 对象作为参数传递。早期版本的 Firebase-UI 库需要一个具有 4 个参数的构造函数。见这里official documentation

    如果您有兴趣,this 是您从 Firebase 实时数据库中检索数据并使用 FirebaseRecyclerAdapter 将其显示在 RecyclerView 中的方法。

    【讨论】:

    • 你能帮我消除这个错误吗?我检查了链接,但都和我写的一样
    • 不是。请按照我在此post 的回答中的确切步骤进行操作。看到 FirebaseRecyclerAdapter 是使用 FirebaseRecyclerOptions 对象实例化的。
    • 一切都好吗?问题解决了吗?
    【解决方案3】:

    在您的 onStart 方法中从您的代码中删除这个逗号

     FirebaseRecyclerAdapter<Blog,BlogViewHolder,>firebaseRecyclerAdapter
                                                ^
    

    【讨论】:

    【解决方案4】:

    像下面的代码一样制作适配器..

    public class RecyclerViewAdpater extends RecyclerView.Adapter<RecyclerViewAdpater.ItemViewHolder> {
    List<String> mStringList = new ArrayList<>();// hear you can pass any pojo class object.
    Context mContext;
    
    public RecyclerViewAdpater(List<String> mStringList, Context mContext) {
        this.mStringList = mStringList;
        this.mContext = mContext;
    }
    
    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_main, parent, false);
        return new ItemViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(ItemViewHolder holder, int position) {
        // below code handle click event on recycler view item.
        String data=mStringList.get(position);
        holder.textView.setText(data);
    }
    
    @Override
    public int getItemCount() {
        return mStringList.size();
    }
    
    public class ItemViewHolder extends RecyclerView.ViewHolder {
        TextView textView;
    
        public ItemViewHolder(View itemView) {
            super(itemView);
        }
    }
    }
    

    然后在主要活动中获取您的数据然后在调用下面的代码之后..

            RecyclerViewAdpater recyclerViewAdpater=new RecyclerViewAdpater(this,stringlist);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(recyclerViewAdpater);
        recyclerViewAdpater.notifyDataSetChanged();
    

    确保传递的数据列表不为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-30
      • 2019-05-24
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      相关资源
      最近更新 更多