1、问题描述
问题出在事件的分发机制上,
我的子项布局响应事件是从《第一行代码》中学的,它把响应事件定义在适配器中。
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_item, viewGroup, false);
final ViewHolder viewHolder = new ViewHolder(view);
viewHolder.textView.setOnClickListener(v -> logd);
viewHolder.imageView.setOnClickListener(v -> logd);
return viewHolder;
}
后来我在后续实践中添加侧滑事件,侧滑事件的点击是由RecyclerView来响应的
而如果在子项布局中进行了对click事件的处理,click事件就被拦截了
2、解决办法:
将响应事件放在activity中执行,adapter中只做监听
参考资料:https://blog.youkuaiyun.com/lmj623565791/article/details/45059587
思路:
1、在adapter中定义方法方法接口,click发生之后,调用这个方法。而这个抽象方法的实现在activity中实现
2、因为有很多点击、触摸事件,所以定义一个抽象类,在抽象类中放所有需要的抽象方法。click发生之后,调用抽象类的抽象方法,这个抽象类在activity中实现
3、不足之处,我的浅尝辄止:
1、这里的侧滑菜单的响应究竟是事件分发机制的哪一层呢? //SwipeRecyclerView的设置尝试
//侧滑菜单
recyclerView.setSwipeMenuCreator(swipeMenuCreator);
recyclerView.setOnItemMenuClickListener(mMenuItemClickListener);
2、子项布局的响应事件,虽然是放在了activity中,但又是在分发机制的哪一层呢?虽然具体处理方法放在了activity中实现,然后传入adapter。可是对点击事件的监听依然在adapter中啊?这究竟有什么不同?
adapter.setOnItemClickLitener(new RecyclerView_Adapter.OnItemClickLitener()
{
@Override
public void onImageClick(RecyclerView_item item) {
Intent intent = new Intent(RecyclerView_activity.this, ItemImg_activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("img_id", item.getImg_id());
startActivity(intent);
}
@Override
public void onContextClick(RecyclerView_item item) {
Intent intent = new Intent(RecyclerView_activity.this, ItemContext_activity.class);
intent.putExtra("context", item.getContext());
intent.putExtra("title", item.getTitle());
intent.putExtra("img_id", item.getImg_id());
startActivity(intent);
}
});
3、《第一行代码》中的绑定事件是在onCreateViewHolder中,这里是放在onBindViewHolder绑定 为什么?有什么区别?
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_item, viewGroup, false);
final ViewHolder viewHolder = new ViewHolder(view);
viewHolder.textView.setOnClickListener(v -> logd);
viewHolder.imageView.setOnClickListener(v -> logd);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
RecyclerView_item item = items.get(i);
viewHolder.imageView.setImageResource(item.getImg_id());
viewHolder.textView.setText(item.getTitle());
if (mOnItemClickLitener != null) {
viewHolder.imageView.setOnClickListener(v->mOnItemClickLitener.onImageClick(item));
viewHolder.textView.setOnClickListener(v->mOnItemClickLitener.onContextClick(item));
}
}