嵌套 RecyclerView OnclickListener

Mou*_*tib 2 android onclicklistener android-recyclerview nestedrecyclerview

我将 RecyclerView (MainRecyclerview 和 ChildRecyclerview)与两个适配器(MainRecyclerviewAdapter 和 ChildRecyclerviewAdapter)嵌套在一起,我创建了一个接口来处理 childRecyclerview 的点击,但我只能在 MainRecyclerviewAdapter 中访问该点击。我想知道如何处理 MainActivity 中 childRecyclerview 中项目的点击,谢谢。

这是我的代码:

//主要活动

公共类 MainActivity 扩展 AppCompatActivity {

List<Section> sectionList = new ArrayList<>();
RecyclerView mainRecyclerView;
LinearLayoutManager layoutManager;
MainRecyclerAdapter mainRecyclerAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile_properties);

    initData();
    initRecyclerView();



}
Run Code Online (Sandbox Code Playgroud)

}

//ChildRecyclerAdapter

公共类 ChildRecyclerAdapter 扩展 RecyclerView.Adapter<ChildRecyclerAdapter.ChildViewHolder> {

private final List<String> items;
private OnItemClickListener mListener;

public ChildRecyclerAdapter(List<String> items) {
    this.items = items;
}

public void setOnItemClickListener(OnItemClickListener listener) {
    mListener = listener;
}

@NonNull
@Override
public ChildViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row, parent, false);
    return new ChildViewHolder(view, mListener);
}

@Override
public void onBindViewHolder(@NonNull ChildViewHolder holder, int position) {
    holder.itemTextView.setText(items.get(position));
}

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


public class ChildViewHolder extends RecyclerView.ViewHolder {

    TextView itemTextView;

    ChildViewHolder(final View itemView, OnItemClickListener listener) {
        super(itemView);
        itemTextView = itemView.findViewById(R.id.txt_item_view);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (listener != null) {
                    int position = getBindingAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        String item = items.get(position);
                        listener.onItemClick(item);
                    }
                }
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

}

//主回收器适配器

公共类 MainRecyclerAdapter 扩展 RecyclerView.Adapter<MainRecyclerAdapter.MainViewHolder> {

List<Section> sectionList;

public MainRecyclerAdapter(List<Section> sectionList) {
    this.sectionList = sectionList;
}

@NonNull
@Override
public MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View view = inflater.inflate(R.layout.section_row, parent, false);
    return new MainViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MainViewHolder holder, int position) {

    Section section = sectionList.get(position);
    String sectionName = section.getSectionName();
    List<String> items = section.getSectionItems();

    holder.sectionNameTextView.setText(sectionName);
    ChildRecyclerAdapter childRecyclerAdapter = new ChildRecyclerAdapter(items);
    holder.recyclerChild.setAdapter(childRecyclerAdapter);
    childRecyclerAdapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(String item) {
            // TODO: 07/02/2022 handle click

        }
    });

}

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


public static class MainViewHolder extends RecyclerView.ViewHolder {

    TextView sectionNameTextView;
    RecyclerView recyclerChild;

    public MainViewHolder(final View itemView) {
        super(itemView);

        sectionNameTextView = itemView.findViewById(R.id.txt_section_name);
        recyclerChild = itemView.findViewById(R.id.child_recyclerview);
        LinearLayoutManager layoutManager = new LinearLayoutManager(itemView.getContext());
        recyclerChild.setLayoutManager(layoutManager);

    }
}
Run Code Online (Sandbox Code Playgroud)

}

//OnItemClick监听器

公共接口 OnItemClickListener {

void onItemClick(String item);
Run Code Online (Sandbox Code Playgroud)

}

Dev*_*ife 5

您可以简单地再创建一个接口并在嵌套适配器的 onclick 方法中调用它。

因此,当您单击任何适配器项目时,它会将数据从适配器传递到活动。

像这样 :

1. 创建一个接口,用于在 Activity 或 Fragment 中单击子 RecyclerView 项。

首先,您需要从此更改子适配器的点击侦听器

public interface OnItemClickListener {
    void onItemClick(String item);
}
Run Code Online (Sandbox Code Playgroud)

对此:

public interface OnItemClickListener {
    void onItemClick(int childPosition);
}
Run Code Online (Sandbox Code Playgroud)

然后传递子recyclerview的适配器位置而不是字符串值。

现在,创建一个新界面来获取活动或片段中父项和子项的点击。

public interface RvItemClickListener {
    void onChildItemClick(int parentPosition, int childPosition, String item);
}
Run Code Online (Sandbox Code Playgroud)

2. 定义侦听器并在父 RecyclerView 适配器中的子项单击上调用它:

RvItemClickListener rvItemClickListener;
    
public void setRvItemClickListener(RvItemClickListener rvItemClickListener){
    this.rvItemClickListener = rvItemClickListener;
}
Run Code Online (Sandbox Code Playgroud)

3. 在子项目上调用它,单击:

childRecyclerAdapter.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(int childPosition) {
                    String item = items.get(childPosition);
                    rvItemClickListener.onChildItemClick(getAdapterPosition(), childPosition, item);
                  }
               });
Run Code Online (Sandbox Code Playgroud)

4. 最后一步是像平常一样重写 Activity 或 Fragment 中的方法:

@Override
public void onItemClick(int parentPosition, int childPosition, String item) {

}
Run Code Online (Sandbox Code Playgroud)

我希望这足以让您理解我想说的内容。

这只是一个例子。请根据您的需要进行更改。