java - 错误:不兼容的类型:>> 无法转换为 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) {
}
}
我应该使用什么?请帮帮我吧呵呵
解决方案
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 文件中使用的所有文本视图、图像视图。
推荐阅读
- ruby - 有没有办法用 ruby google drive api 上传大文件?
- wpf - 如何使用嵌入颜色的字体?
- python - 请求在 Python 中接收 403 但在浏览器中工作正常
- user-interface - 如何查看小部件的价值?
- javascript - 将 SQL Server 中的日期转换为字符串以在 CanvasJS 图中使用
- python - 如何将子图和表格放入图形区域 matplotlib
- javascript - loopback4 jwt 身份验证问题
- php - WordPress:防止内容字段在保存时保存
- python - 了解最大流量问题的 Python 代码
- python - 提取熊猫列中两个标记之间的文本