首页 > 解决方案 > 不知道如何完成 Firebase RecyclerAdapter

问题描述

我一直在试图弄清楚如何让 Firebase RecyclerAdapter 工作,但无法通过这一点。我在 Stack Overflow 上阅读了很多线程,但无法弄清楚。

我还没有完成 onBindViewHolder 但是,onCreateViewHolder 也不起作用。“父母”一词始终为红色。

问题出在 AllUserActivitys.java 文件中,我也提供了其余代码。

这是我的代码:

AllUsersActivity.java:

package com.example.android.whammychat;

import android.provider.ContactsContract;
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.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

public class AllUsersActivity extends AppCompatActivity {

    private Toolbar mAllUsersToolBar;
    private RecyclerView mAllUsersRecyclerView;
    private DatabaseReference mAllUsersDatabase;

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

        mAllUsersToolBar = findViewById(R.id.allUsersToolBar);
        setSupportActionBar(mAllUsersToolBar);
        getSupportActionBar().setTitle("All Users");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        mAllUsersDatabase = FirebaseDatabase.getInstance().getReference().child("Users");

        mAllUsersRecyclerView = findViewById(R.id.allUsersRecyclerView);
        mAllUsersRecyclerView.setHasFixedSize(true);
        mAllUsersRecyclerView.setLayoutManager(new LinearLayoutManager(this));



    }

    //We are putting this in .onStart because we want to retrieve the data in real time.
    @Override
    protected void onStart() {
        super.onStart();


        FirebaseRecyclerOptions<Users> options =
                new FirebaseRecyclerOptions.Builder<Users>()
                        .setQuery(mAllUsersDatabase, Users.class)
                        .build();


        FirebaseRecyclerAdapter firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Users, UsersViewHolder>(options) {

            @NonNull
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.individual_user, parent, false);

                return new UsersViewHolder(view);

            }

            @Override
            protected void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull Object model) {

            }

        };


    }


    public class UsersViewHolder extends RecyclerView.ViewHolder {

        View mView;

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

            /*
           itemView is a single row in the ListView.
           We are going to be using mView later to perform an onClickListener method on the ViewHolder.
             */
            mView = itemView;

        }
    }

}

用户.java:

package com.example.android.whammychat;

public class Users {

    public String username;
    public String status;
    public String image;

    //Constructor without parameters is also needed because: https://stackoverflow.com/questions/18993936/how-to-best-explain-and-use-empty-constructors-in-java
    public Users() {

    }

    public Users(String username, String status, String image) {
        this.username = username;
        this.status = status;
        this.image = image;
    }

    //Getters
    public String getUsername() {
        return username;
    }

    public String getStatus() {
        return status;
    }

    public String getImage() {
        return image;
    }


}

活动所有用户:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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=".AllUsersActivity">

    <include
        android:id="@+id/allUsersToolBar"
        layout="@layout/app_bar"/>

    <view
        android:id="@+id/allUsersRecyclerView"
        class="android.support.v7.app.AlertController$RecycleListView"
        android:layout_width="match_parent"
        android:layout_height="512dp"
        android:layout_marginTop="56dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </view>

</android.support.constraint.ConstraintLayout>

个人用户.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="139dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/individualUserPictureImageView"
            android:layout_width="105dp"
            android:layout_height="100dp"
            android:layout_marginStart="16dp"
            android:layout_marginTop="20dp"
            android:src="@drawable/profile_pic"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/individualUserStatusTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginStart="24dp"
            android:layout_marginTop="12dp"
            android:text="TextView"
            android:textSize="18sp"
            app:layout_constraintStart_toEndOf="@+id/individualUserPictureImageView"
            app:layout_constraintTop_toBottomOf="@+id/individualUserNameTextView" />

        <TextView
            android:id="@+id/individualUserNameTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignStart="@+id/individualUserStatusTextView"
            android:layout_marginStart="24dp"
            android:layout_marginTop="28dp"
            android:text="TextView"
            android:textColor="@android:color/black"
            android:textSize="24sp"
            android:textStyle="bold"
            app:layout_constraintStart_toEndOf="@+id/individualUserPictureImageView"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>


</android.support.constraint.ConstraintLayout>

编辑:AllUsersActivity.java 文件部分中的“RecyclerView.ViewHolder”现在带有红色下划线,因为它表示 FirebaseRecyclerAdapter 与 android.support.v7.widget.RecyclerView.adapter 发生冲突。我尝试删除 import android.support.v7.widget.RecyclerView; 来自 AllUsersActivity.java 文件,但它会自动返回。我能做些什么?

标签: androidfirebasefirebase-realtime-databaseandroid-recyclerview

解决方案


问题出在你的onCreateViewHolder

代替:

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.individual_user, parent, false);

    return new UsersViewHolder(view);

}

和:

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.individual_user, viewGroup, false);
    return new UsersViewHolder(view);

}

推荐阅读