【问题标题】:App crashes while setting a CircleImageView with Picasso in FirebaseRecyclerAdapter [duplicate]在 FirebaseRecyclerAdapter 中使用 Picasso 设置 CircleImageView 时应用程序崩溃 [重复]
【发布时间】:2019-10-11 11:19:10
【问题描述】:

我正在尝试使用来自 firebase 的数据显示 RecyclerView

我不知道为什么会出现这个错误:

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)

那在我的UsersActivity 中,我想在那里显示RecyclerView。我也有ViewHoldermodel.getImage()给了图片下载Url,不知道为什么不能把图片存入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);
        }
    }
}

这是我的Users.java 代码:

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

其他可能有用的文件:

活动的布局是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>

列表项布局users_single_layout.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="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>

另外,我的数据库的外观:

【问题讨论】:

    标签: java android firebase firebase-realtime-database picasso


    【解决方案1】:

    有些事情我还不是很清楚。但是,我认为这不是您在 Firebase 数据库中拥有的完整数据。我想您正在获得一系列用户。因此,您对 firebase 适配器的初始化需要进行如下修改。

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

    你的Users 类需要有另一个我认为缺少的属性。

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

    在我看来,其他人看起来还不错。让我知道这是否能解决您的问题。

    【讨论】:

    • 不,这给了我一个错误,我不能将数组作为参数放在 .setQuery 中。
    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多