首页 > 解决方案 > 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();
}
}

标签: javaandroid

解决方案


您可以为 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);

推荐阅读