【问题标题】:RecyclerView is not showing data from Firebase on my app ScreenRecyclerView 未在我的应用屏幕上显示来自 Firebase 的数据
【发布时间】:2018-05-21 13:09:16
【问题描述】:

我想使用 recyclerview 在我的应用屏幕上显示 Firebase 数据。我的应用程序正在运行,没有任何错误,但屏幕上没有显示数据。 请帮忙 这是我的代码: 请检查并帮助我使用 recyclerview 将数据从 firebase 显示到应用屏幕

VenuesActivity.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.LayoutInflater;
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.firebase.ui.database.FirebaseRecyclerOptions;
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));



    }

    FirebaseRecyclerOptions<Blog> options =
            new FirebaseRecyclerOptions.Builder<Blog>()
                    .setQuery(mDatabase, Blog.class)
                    .build();

    @Override
    protected void onStart() {
        super.onStart();



        FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(options) {
            @Override
            public BlogViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.venue_row, parent, false);

                return new BlogViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(BlogViewHolder holder, int position, Blog model) {
                // Bind the image_details object to the BlogViewHolder
                // ...

                holder.setTitle(model.getTitle());
                holder.setDesc(model.getDesc());
                holder.setImage(getApplicationContext(),model.getImage());

            }
        };




//        FirebaseRecyclerAdapter<Blog,BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>
//                (Blog.class,R.layout.venue_row,BlogViewHolder.class,mDatabase) {
//            @Override
//            protected void onBindViewHolder(@NonNull BlogViewHolder viewHolder, int position, @NonNull Blog model) {
//
//                viewHolder.setTitle(model.getTitle());
//                viewHolder.setDesc(model.getDesc());
//                viewHolder.setImage(getApplicationContext(),model.getImage());
//
//            }
//
//            @NonNull
//            @Override
//            public BlogViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//                return null;
//            }
//        };

        mBlogList.setAdapter(adapter);

    }

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

}

场地活动.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

<?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>

build.gradel

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.cornicore.icccricketworldcup2019"
        minSdkVersion 17
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.android.support:cardview-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    implementation 'com.google.firebase:firebase-core:15.0.2'
    implementation 'com.google.firebase:firebase-messaging:15.0.2'
    implementation 'com.google.firebase:firebase-database:15.0.1'
    implementation 'com.google.firebase:firebase-storage:15.0.2'
    implementation 'com.google.firebase:firebase-auth:15.1.0'
    implementation 'com.firebaseui:firebase-ui-database:3.2.2'
    implementation 'com.squareup.picasso:picasso:2.5.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

apply plugin: 'com.google.gms.google-services'

【问题讨论】:

    标签: android firebase firebase-realtime-database android-recyclerview firebaseui


    【解决方案1】:

    在设置适配器后添加这些行:

    mBlogList.setAdapter(adapter);
    mFirebaseAdapter.startListening();
    

    【讨论】:

    • 你能解释一下这是做什么的吗?
    • 抱歉回复晚了 mBlogList.setAdapter(adapter); // 它将设置适配器和 mFirebaseAdapter.startListening(); // 它将开始从互联网上加载数据。
    【解决方案2】:

    解决这个问题,请按以下步骤操作:

    1. 删除:mBlogList.setHasFixedSize(true);

    2. adapter 的声明移到onCreate() 方法中。

    3. 使您的 adapter 变量全局化:

      private FirebaseRecyclerAdapter<Blog, BlogViewHolder> adapter;
      
    4. onCreate() 方法中删除FirebaseRecyclerAdapter&lt;Blog, BlogViewHolder&gt;

    5. onStart()onStop() 方法中添加以下代码行。

      @Override
      protected void onStart() {
          super.onStart();
          adapter.startListening();
      }
      
      @Override
      protected void onStop() {
          super.onStop();
          if(adapter != null) {
              adapter.stopListening();
          }
      }
      

    【讨论】:

    • 不工作。我在 cmets 部分发布了编辑后的代码。请检查一次
    • 你忘了添加mBlogList.setAdapter(adapter); 在适配器声明后添加这一行。现在可以用了吗?
    • adapter = new FirebaseRecyclerAdapter(options) {... }; mBlogList.setAdapter(适配器); }
    • 好的,你有错误吗?使用更改后的代码编辑问题。
    • 一切都好吗?问题解决了吗?
    【解决方案3】:

    我认为您必须编写错误的代码。你可以试试这种方式。

        public class SavedRestaurantListActivity extends AppCompatActivity {
            private DatabaseReference mRestaurantReference;
            private FirebaseRecyclerAdapter mFirebaseAdapter;
    
            @Bind(R.id.recyclerView) RecyclerView mRecyclerView;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
    
                setContentView(R.layout.activity_restaurants);
                ButterKnife.bind(this);
    
                mRestaurantReference = FirebaseDatabase.getInstance().getReference(Constants.FIREBASE_CHILD_RESTAURANTS);
                setUpFirebaseAdapter();
            }
    
            private void setUpFirebaseAdapter() {
                mFirebaseAdapter = new FirebaseRecyclerAdapter<Restaurant, FirebaseRestaurantViewHolder>
                        (Restaurant.class, R.layout.restaurant_list_item, FirebaseRestaurantViewHolder.class, 
                            mRestaurantReference) {
    
                    @Override
                    protected void populateViewHolder(FirebaseRestaurantViewHolder viewHolder, 
                        Restaurant model, int position) {
                        viewHolder.bindRestaurant(model);
                    }
                };
                mRecyclerView.setHasFixedSize(true);
                mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
                mRecyclerView.setAdapter(mFirebaseAdapter);
            }
    
            @Override
            protected void onDestroy() {
                super.onDestroy();
                mFirebaseAdapter.cleanup();
            }
            @Override
            protected void onStart() {
                super.onStart();
                mFirebaseAdapter.startListening();
            }
    
            @Override
            protected void onStop() {
                super.onStop();
                if(mFirebaseAdapter != null) {
                    mFirebaseAdapter.stopListening();
                }
            }
        }
    

    【讨论】:

      【解决方案4】:

      解决方案很简单..请将 recyclerview 的 layout_height 从 match_parent 更改为 wrap_content

      稍后谢谢我

      【讨论】:

      • 请提供一个代码 sn-p 作为您提议的示例,以便更容易确定您建议在哪里进行此更改。
      • 在您的回收站视图 XML 文件中。添加。安卓:layout_height="match_parent"
      猜你喜欢
      • 1970-01-01
      • 2018-08-30
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 2021-01-13
      • 2019-05-24
      • 1970-01-01
      相关资源
      最近更新 更多