>> 无法转换为 OnNoteListener,java,android,android-recyclerview"/>

首页 > 解决方案 > 错误:不兼容的类型:>> 无法转换为 OnNoteListener

问题描述

这段代码有什么问题?我使用了 Activity 并将其传递给片段

RecyclerView OnClickListener 是我在这种编码方法中使用的。

我只想点击recyclerview 将我发送到另一个页面

请立即帮助我:(

这是我的用户适配器

public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UsersViewHolder> {
private Context mCtx;
private ArrayList<UserDataResponse> userDataResponseList = new ArrayList<>();
private OnNoteListener mOnNoteListener;


public UsersAdapter(Context mCtx, ArrayList<UserDataResponse> userDataResponseList, OnNoteListener 
onNoteListener) {
    this.mCtx = mCtx;
    this.userDataResponseList = userDataResponseList;
    this.mOnNoteListener = onNoteListener;
}

@NonNull
@Override
public UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(mCtx).inflate(R.layout.recycle_view, parent, false);

    return new UsersAdapter.UsersViewHolder(view, mOnNoteListener);
}

@Override
public void onBindViewHolder(@NonNull UsersAdapter.UsersViewHolder holder, int position) {

    holder.textViewName.setText("Username: " + userDataResponseList.get(position).getRTMusername());
    holder.textViewEmail.setText("Firstname: " + userDataResponseList.get(position).getRTMfirstname());
    holder.textViewLastname.setText("Lastname: " + userDataResponseList.get(position).getRTMlastname());
    holder.textViewDepartment.setText("Department: " + userDataResponseList.get(position).getRTMdepartment());




}

@Override
public int getItemCount() {

    return userDataResponseList.size();
}

class UsersViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView textViewName,textViewEmail,textViewLastname,textViewDepartment;
    OnNoteListener onNoteListener;

    public UsersViewHolder(@NonNull View itemView, OnNoteListener onNoteListener) {

        super(itemView);

        textViewName = itemView.findViewById(R.id.textViewName);
        textViewEmail = itemView.findViewById(R.id.textViewEmail);
        textViewLastname = itemView.findViewById(R.id.textViewLastname);
        textViewDepartment = itemView.findViewById(R.id.textViewDepartment);
        this.onNoteListener = onNoteListener;

        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        onNoteListener.onNoteClick(getAdapterPosition());

    }
}
public interface OnNoteListener{
    void onNoteClick(int postion);
}
}

这是我的 AdminUser.java

public class AdminUserFragment extends Fragment implements UsersAdapter.OnNoteListener {

private RecyclerView recyclerView;
private UsersAdapter adapter;
Api api;

 ArrayList<String> Userdata;
 ArrayList<UserDataResponse> userDataResponseArrayList = new ArrayList<>();
 Redirectinglog redirectinglog;
private Handler refresherHandler = new Handler();

public AdminUserFragment() {

}
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_adminuser,container, false);

}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    Userdata = new ArrayList<>();
    redirectinglog = new Redirectinglog(getActivity());

    api = RetrofitClientInstance.GetResultAPI().create(Api.class);

    recyclerView = view.findViewById(R.id.recyclerView);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    /////////////////////////////////////////////////////

    refreshRunnable.run();






}
private  void responseuserdata(){

    Call<List<UserDataResponse>> usercall = api.getUsers();

    usercall.enqueue(new Callback<List<UserDataResponse>>() {
        @Override
        public void onResponse(Call<List<UserDataResponse>> call, Response<List<UserDataResponse>> response) {

            userDataResponseArrayList = new ArrayList<>(response.body());

            for(UserDataResponse UserDataResponsetest :  userDataResponseArrayList){

                adapter = new UsersAdapter(getActivity(), userDataResponseArrayList, this);

                recyclerView.setAdapter(adapter);

            }

        }

        @Override
        public void onFailure(Call<List<UserDataResponse>> call, Throwable t) {
            Toast.makeText(getActivity(), t.getMessage(), Toast.LENGTH_SHORT).show();

        }
    });

}

private Runnable refreshRunnable = new Runnable() {
    @Override
    public void run() {
        responseuserdata();
        refresherHandler.postDelayed(this, 10000);
    }
};


@Override
public void onNoteClick(int postion) {

}
}

我应该使用什么?请帮帮我吧呵呵

标签: javaandroidandroid-recyclerview

解决方案


adapter = new UsersAdapter(getActivity(), userDataResponseArrayList, this);

在这里,您传递的是匿名类,而不是传递其类实现 onNoteListener 接口的对象。这就是为什么,存在兼容性问题。”这对应于一个匿名类,因为您是从一个匿名类调用它,该类作为 Usercall.enque 的参数传递给它。

我对你的建议是,不要制造所有的混乱,你可以简单地在你的 onbindViewHolder 中设置一个标签并传递位置,每当用户点击回收器视图时,你可以在 onClick 方法上检查它,如果你只需将 Onclicklistener 连接到回收器视图。您可以从相关行中检索标签值并找出单击了哪个位置。简单易行。如果您在理解我所说的内容时遇到任何问题,请在下方评论,我会编写代码样品也是如此。希望我的回答有所帮助,如果有帮助,请将其标记为已接受。干杯。

在您的 UserViewHolderClass 中创建一个视图作为成员变量,并在此“ViewHolderClass”的构造函数中写入 this.view = view,以为其分配行值。

//inside onBindViewholder class, write
MyViewHolder.view.setTag("position")
        MyHolder.view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = view.getTag("position")// this will give you 
                                              //the position of the row which will be tapped
            }
        });

另外,如果你要创建一个成员值视图,你不需要在文本视图中保留其他成员变量,在你的 onCreateViewHolder 中,你可以简单地做 view.findviewid("pass id of textview, image view 不管你在你的行ans you want) 并获取适当的小部件作为您的行中的元素。这是因为此视图将包含您在行的 xml 文件中使用的所有文本视图、图像视图。


推荐阅读