Не знаю, как закончить Firebase RecyclerAdapter - PullRequest
0 голосов
/ 05 сентября 2018

Я ломал голову, пытаясь понять, как заставить работать Firebase RecyclerAdapter, но не могу пройти через это. Я много читал о переполнении стека, но не могу понять.

Я еще не завершил 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;

        }
    }

}

Users.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;
    }


}

activity_all_users:

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

individual_user.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>

EDIT: «RecyclerView.ViewHolder» в части файла AllUsersActivity.java теперь выделен красным, потому что это говорит о том, что FirebaseRecyclerAdapter конфликтует с android.support.v7.widget.RecyclerView.adapter. Я попытался удалить импорт android.support.v7.widget.RecyclerView; из файла AllUsersActivity.java, но он продолжает автоматически возвращаться. Что я могу сделать?

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Чтобы решить эту проблему, просто измените следующую строку кода:

View view = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.individual_user, parent, false);

до

View view = LayoutInflater.from(viewGroup.getContext())
        .inflate(R.layout.individual_user, parent, false);

В вашем коде группа представления участника - это объект viewGroup, который является аргументом в вашем onCreateViewHolder() методе.

Если вам интересно, это - рекомендуемый способ извлечения данных из базы данных Firebase Realtime и отображения их в RecyclerView с использованием FirebaseRecyclerAdapter.

0 голосов
/ 05 сентября 2018

Этот код работает сейчас. AllUsersActivity

public class AllUsersActivity extends AppCompatActivity {

    private Toolbar mAllUsersToolBar;
    private RecyclerView mAllUsersRecyclerView;
    FirebaseRecyclerAdapter<Users, UsersViewHolder> firebaseUsersAdapter = null;

    @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);
        mAllUsersRecyclerView = findViewById(R.id.allUsersRecyclerView);

        Query query = FirebaseDatabase.getInstance().getReference().child("Users"); // you can add child as .child("child_name");

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

         firebaseUsersAdapter = new FirebaseRecyclerAdapter<Users, UsersViewHolder>(
                options) {
            @Override
            protected void onBindViewHolder(UsersViewHolder holder, int position, Users model) {
                holder.mIndividualUserName.setText(model.getUsername());
                holder.mIndividualUserStatus.setText(model.getStatus());
                holder.mIndividualUserPicture.setImageDrawable(getDrawable(R.drawable.profile_pic));
            }

            @Override
            public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.individual_user, parent, false);
                return new UsersViewHolder(view);
            }
        };

        mAllUsersRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mAllUsersRecyclerView.setAdapter(firebaseUsersAdapter);
        firebaseUsersAdapter.startListening();

    }

    @Override
    protected void onResume() {
        super.onResume();
        if(firebaseUsersAdapter != null){
            firebaseUsersAdapter.startListening();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(firebaseUsersAdapter != null){
            firebaseUsersAdapter.stopListening();
        }
    }
}

UsersViewHolder Я извлек этот класс из занятия, это поможет вам получить лучший код.

public class UsersViewHolder extends RecyclerView.ViewHolder {

    protected ImageView mIndividualUserPicture;
    protected TextView mIndividualUserName;
    protected TextView mIndividualUserStatus;


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

        mIndividualUserPicture = itemView.findViewById(R.id.individualUserPictureImageView);
        mIndividualUserName = itemView.findViewById(R.id.individualUserNameTextView);
        mIndividualUserStatus = itemView.findViewById(R.id.individualUserStatusTextView);


    }
}

Также я внес небольшое изменение в макет Individual_user:

<?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="wrap_content">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="139dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        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>

Я протестировал этот код, и приложение запустилось, как и ожидалось.

App: enter image description here

Если вам нужно что-то еще, вы можете отправить мне сообщение на мой адрес электронной почты, оно есть в вашей базе данных;)

0 голосов
/ 05 сентября 2018

Проблема в вашем 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);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...