Mou*_*tib 2 android onclicklistener android-recyclerview nestedrecyclerview
这是我的代码:
//主要活动
公共类 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)
}
您可以简单地再创建一个接口并在嵌套适配器的 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)
我希望这足以让您理解我想说的内容。
这只是一个例子。请根据您的需要进行更改。