为什么我无法在 recyclerview 上单击我的项目

问题描述

我无法点击 recyclerview 上的项目,我不知道为什么,有人能帮我解决这个问题吗?

所以这是在我的 MainActivity 代码中,我在 onCreate 中调用这个函数

private void showRecyclerList(){
    recyclerView.setLayoutManager(new linearlayoutmanager(MainActivity.this));
    UserAdapter userAdapter = new UserAdapter(this,usermodel);
    recyclerView.setAdapter(userAdapter);

    userAdapter.setonItemClickCallback(new UserAdapter.OnItemClickCallback() {
        @Override
        public void onItemClicked(usermodel data) {
        Intent intent = new Intent(MainActivity.this,UserDetailActivity.class);
        intent.putExtra(UserDetailActivity.EXTRA_DATA,(Parcelable) usermodel);
        startActivity(intent);
        }
    });
}

我使用了 OnItemClickCallback 中的接口,并将其添加用户适配器上,这是我的用户适配器:

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ListViewHolder> {

private Context context;
private List<usermodel> userData = new ArrayList<>();

private OnItemClickCallback onItemClickCallback;

public void setonItemClickCallback(final OnItemClickCallback onItemClickCallback) {
    this.onItemClickCallback = onItemClickCallback;
}

public static final String DATA_EXTRA = "data_extra";


public UserAdapter(Context context,List<usermodel> userData) {
    this.context = context;
    this.userData = userData;
}


@NonNull
@Override
public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.item_user,parent,false);
    return new ListViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ListViewHolder holder,int position) {
    //usermodel user = userData.get(position);

    holder.itemView.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onItemClickCallback.onItemClicked(userData.get(holder.getAdapterPosition()));
        }
    });

    Glide.with(context)
            .load(userData.get(position).getAvatarUrl())
            .into(holder.imgPhoto);

    holder.tvName.setText(userData.get(position).getLogin());
}

@Override
public int getItemCount() {
    return userData.size();
}

public class ListViewHolder extends RecyclerView.ViewHolder
{
    ImageView imgPhoto;
    TextView tvName;
    public ListViewHolder(View itemView) {
        super(itemView);
        imgPhoto = itemView.findViewById(R.id.iv_avatar);
        tvName = itemView.findViewById(R.id.tv_name);

    }

}

public interface OnItemClickCallback {
    void onItemClicked(usermodel data);
}

这是我的错误信息:

java.lang.NullPointerException:尝试在空对象引用上调用接口方法“void com.dicoding.githubuserwithapi.UserAdapter$OnItemClickCallback.onItemClicked(com.dicoding.githubuserwithapi.model.usermodel)” 在 com.dicoding.githubuserwithapi.UserAdapter$1.onClick(UserAdapter.java:60) 在 android.view.View.performClick(View.java:7357) 在 android.view.View.performClickInternal(View.java:7334) 在 android.view.View.access$3600(View.java:808) 在 android.view.View$PerformClick.run(View.java:28200) 在 android.os.Handler.handleCallback(Handler.java:907) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7478) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941) I/Process:发送信号。 PID:9602 SIG:9

我在 UserAdapter 第 60 行出错

holder.itemView.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            **onItemClickCallback.onItemClicked(userData.get(holder.getAdapterPosition()));**
        }
    });

在我的 usermodel 类中,只有来自用户的数据,我在它上面使用了 Parcelable。

我想我找不到位置,但我不知道在哪里可以修复它,所以你们能帮我解决这个问题吗..

解决方法

在创建 LayoutInflater 时,您应该使用 parent.context

View view = LayoutInflater.from(parent.context).inflate(R.layout.item_user,parent,false);

如果 getAdapterPosition() 已经作为 position 的参数可供您使用,为什么还要调用适配器的 onBindViewHolder()

onItemClickCallback.onItemClicked(userData.get(position));

当您定义点击侦听器时,您并没有使用传递给它的数据。

userAdapter.setOnItemClickCallback(new UserAdapter.OnItemClickCallback() {
        @Override
        public void onItemClicked(UserModel data) {
        Intent intent = new Intent(MainActivity.this,UserDetailActivity.class);
        intent.putExtra(UserDetailActivity.EXTRA_DATA,(Parcelable) **userModel**);
        startActivity(intent);
        }
    });

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...