java - RecyclerView,继承自一个自定义的 Recycler View 适配器
问题描述
我有这两个相似的行为回收器视图适配器,它们之间的唯一区别是 onclick 方法和传递给它们的对象。所以,我正在考虑设计类 B 以从回收器视图适配器继承,这样我就可以更改构造函数来做我想做的事情,而不是创建两个非常相似的类。有人可以给我一些提示和见解如何实现这个想法吗?
public class GroupRecycleAdapter extends RecyclerView.Adapter<GroupRecycleAdapter.GroupViewHolder>{
private List<Group> groupList;
private Context context;
public class GroupViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView showingTextView, nameTextview;
ImageView icon;
public GroupViewHolder(View itemView){
super(itemView);
showingTextView = itemView.findViewById(R.id.group_children_edittext);
nameTextview = itemView.findViewById(R.id.postMemberName);
icon = itemView.findViewById(R.id.group_children_image);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Log.d(TAG, "onClicked " + getAdapterPosition());
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setView(R.layout.member_input_popup);
builder.setPositiveButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.setNegativeButton("CONFIRM", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
public GroupRecycleAdapter(List<Group> groupList, Context context){
this.groupList = groupList;
this.context = context;
}
public GroupRecycleAdapter(Context context){
this.context = context;
}
@NonNull
@Override
public GroupViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.member_input_name_layout,parent,false);
return new GroupViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull GroupViewHolder holder, int position) {
String member = groupList.get(position).name;
holder.showingTextView.setVisibility(View.GONE);
holder.icon.setVisibility(View.GONE);
holder.nameTextview.setText(member);
}
@Override
public int getItemCount() {
return groupList.size();
}
public void setGroup(List<Group> group) {
groupList = group;
notifyDataSetChanged();
}
}
解决方案
您可以为 GroupRecycleAdapter 创建一个接口,并在使用此适配器的片段/活动中实现该接口。您可以通过适配器的构造函数传递该接口的实现。
适配器样本
public class GroupRecycleAdapter extends RecyclerView.Adapter<GroupRecycleAdapter.GroupViewHolder>{
@NonNull
private Link link;
public GroupRecyclerAdapter(@NonNull Link link){
this.link = link;
}
public class GroupViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView showingTextView, nameTextview;
ImageView icon;
public GroupViewHolder(View itemView){
super(itemView);
showingTextView = itemView.findViewById(R.id.group_children_edittext);
nameTextview = itemView.findViewById(R.id.postMemberName);
icon = itemView.findViewById(R.id.group_children_image);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Log.d(TAG, "onClicked " + getAdapterPosition());
Group group = groupList.get(getLayoutPosition());
link.onItemClicked(v,group);
//Shift this code to fragment/activity where Link interface is implemented
}
}
public interface Link{
void onItemClicked(View v,Group group);
}
}
在片段/活动中
您可以像下面这样创建一个实现 Link 接口的对象,或者您可以让片段/活动实现接口 Link
GroupRecycleAdapter.Link link = new GroupRecycleAdapter.Link(){
public void onItemClicked(View v,Group group){
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setView(R.layout.member_input_popup);
builder.setPositiveButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.setNegativeButton("CONFIRM", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
根据需要更改上述函数onItemClicked中的代码
适配器构造函数
GroupRecyclerAdapter adapter = new GroupRecyclerAdapter(link);
推荐阅读
- reactjs - 我如何在 React native 中创建倒计时功能?
- python - Python 2.7(套接字) - 如果在前一个端口上发生 socket.error,如何在下一个端口上继续
- javascript - 每个 React 组件都应该有自己的样式表吗?
- javascript - XMLHttpRequest 捕获空 XML 响应,状态为 200
- mysql - 每分钟给定日期,每两个提取一次
- javascript - Firebase 事务返回 null 并完成且没有错误
- angular - Angular Material 对话框:复选框总是返回 false
- javascript - Javascript:在基于服务器数据的动态生成的表上向 TD 添加类
- python - C++ 和 Python 写入磁盘的方式不同吗?
- python - 了解python中的内存使用情况