1

I'm trying to display a RecyclerView with data from firebase.

I don't know why I get this error:

Process: com.example.lapitchat, PID: 29868
    java.lang.IllegalArgumentException: Target must not be null.
        at com.squareup.picasso.RequestCreator.into(RequestCreator.java:682)
        at com.squareup.picasso.RequestCreator.into(RequestCreator.java:665)
        at com.example.lapitchat.UsersActivity$1.onBindViewHolder(UsersActivity.java:65)
        at com.example.lapitchat.UsersActivity$1.onBindViewHolder(UsersActivity.java:61)
        at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
        at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1888)
        at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:407)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:693)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

That's in my UsersActivity, there I want to display that RecyclerView. I also have the ViewHolder in it. model.getImage() gives the image download Url, and I don't know why I can't store the image in holder.singleImage.

public class UsersActivity extends AppCompatActivity {

    private Toolbar mToolbar;

    private RecyclerView mUsersList;
    private DatabaseReference mUsersDatabase;
    private FirebaseRecyclerOptions<Users> options;
    private FirebaseRecyclerAdapter<Users, UsersViewHolder> adapter;

    private static final String TAG = "UsersActivity";

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

        mToolbar = findViewById(R.id.users_appBar);
        setSupportActionBar(mToolbar);

        getSupportActionBar().setTitle("All Users");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

        mUsersList = findViewById(R.id.users_list);
        mUsersList.setHasFixedSize(true);
        mUsersList.setLayoutManager(new LinearLayoutManager(this));

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

        adapter = new FirebaseRecyclerAdapter<Users, UsersViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull UsersViewHolder holder, int position, @NonNull Users model) {

                Picasso.get().load(model.getImage()).into(holder.singleImage);
                holder.singleName.setText(model.getName());
                holder.singleStatus.setText(model.getStatus());
            }

            @NonNull
            @Override
            public UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

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

                return new UsersViewHolder(view);
            }
        };
    }

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

        adapter.startListening();
        mUsersList.setAdapter(adapter);
    }

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

        adapter.stopListening();
        mUsersList.setAdapter(adapter);
    }

    public class UsersViewHolder extends RecyclerView.ViewHolder {
        TextView singleName;
        TextView singleStatus;
        CircleImageView singleImage;

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

            singleName = findViewById(R.id.user_single_name);
            singleStatus = findViewById(R.id.user_single_status);
            singleImage = findViewById(R.id.user_single_image);
        }
    }
}

That's my Users.java code:

package com.example.lapitchat;

public class Users {

    public String image;
    public String name;
    public String status;

    public Users() {
        //needed
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImage() {
        return image;
    }

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

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

Other files that might be useful:

The layout for the activity is activity_users.xml:

<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=".UsersActivity">

    <include
        android:id="@+id/users_appBar"
        layout="@layout/app_bar_layout"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/users_list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/users_appBar">

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

</android.support.constraint.ConstraintLayout>

And the list item layout users_single_layout.xml is the following.

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

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/user_single_image"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_marginStart="15dp"
        android:layout_marginTop="15dp"
        android:layout_marginBottom="15dp"
        android:src="@drawable/avatar"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:src="@drawable/avatar" />

    <TextView
        android:id="@+id/user_single_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="20dp"
        android:text="TextView"
        android:textColor="@android:color/background_dark"
        android:textSize="18sp"
        app:layout_constraintStart_toEndOf="@+id/user_single_image"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/user_single_status"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginTop="10dp"
        android:text="TextView"
        app:layout_constraintStart_toEndOf="@+id/user_single_image"
        app:layout_constraintTop_toBottomOf="@+id/user_single_name" />

</android.support.constraint.ConstraintLayout>

Also, how my database looks:

Reaz Murshed
  • 23,691
  • 13
  • 78
  • 98
Alexandru Stroescu
  • 1,067
  • 1
  • 9
  • 16

1 Answers1

0

Some things are still not very clear to me. However, I think this is not the complete data that you are having in your Firebase database. I suppose you are getting an array of users. Hence your initialization to the firebase adapter needs to be modified like the following.

options = new FirebaseRecyclerOptions.Builder<Users>()
    .setQuery(mUsersDatabase, Users[].class).build(); // Use the array

Your Users class needs to have another attribute which is missing as well I think.

public class Users {
    public String image;
    public String name;
    public String status;
    public String thumb_image; // This is missing
}

The others look okay to me. Let me know if that solves your problem.

Reaz Murshed
  • 23,691
  • 13
  • 78
  • 98