RecyclerView点击时动态切换Toolbar按钮可见性(无需长按)
解决方案:根据联系人选中数量动态显示/隐藏Toolbar按钮
我仔细看了你的代码,目前的问题主要集中在没有正确监听选中联系人数量的变化,以及重复设置RecyclerView触摸监听导致逻辑混乱上。下面是一步步的修复方案:
1. 给Adapter添加选中状态回调接口
首先我们需要让Adapter在选中数量变化时通知Activity,这样Activity才能及时更新Toolbar按钮的显示状态。修改ContactsAdapter.java:
// 在Adapter类顶部定义回调接口 public interface OnSelectionChangeListener { void onSelectionChanged(int selectedCount); } // 增加成员变量保存回调实例 private OnSelectionChangeListener selectionChangeListener; // 提供设置回调的方法 public void setOnSelectionChangeListener(OnSelectionChangeListener listener) { this.selectionChangeListener = listener; } // 修改toggleSelection方法,每次选中状态变化后通知Activity private void toggleSelection(int pos) { currentSelectedIndex = pos; Contact contact = contactList.get(pos); String userId = contact.getUserId(); if (selectedItems.get(pos, false)) { selectedItems.delete(pos); animationItemsIndex.delete(pos); selectedIds.remove(userId); } else { selectedItems.put(pos, true); animationItemsIndex.put(pos, true); selectedIds.add(userId); } notifyItemChanged(pos); // 通知Activity选中数量变化 if (selectionChangeListener != null) { selectionChangeListener.onSelectionChanged(selectedItems.size()); } } // 同时在clearSelections方法里也加上通知 private void clearSelections() { reverseAllAnimations = true; selectedItems.clear(); selectedIds.clear(); notifyDataSetChanged(); if (selectionChangeListener != null) { selectionChangeListener.onSelectionChanged(0); } }
2. 修复Activity里的RecyclerView监听逻辑
你的代码里设置了两次RecyclerTouchListener,这会导致点击事件被重复处理,直接移除其中一个(或者直接用Adapter内部的点击监听,你已经在Adapter里设置了holder.itemView.setOnClickListener,所以可以去掉Activity里的RecyclerTouchListener避免冲突)。
然后在初始化Adapter时绑定回调,处理按钮显示:
private Menu mMenu; // 增加成员变量保存Menu实例,方便后续更新 @Override protected void onCreate(Bundle savedInstanceState) { // ... 其他初始化代码 adapter = new ChooseContactsAdapter(contactList, getApplicationContext()); // 设置选中变化回调 adapter.setOnSelectionChangeListener(new ChooseContactsAdapter.OnSelectionChangeListener() { @Override public void onSelectionChanged(int selectedCount) { updateAddButtonVisibility(selectedCount); } }); recyclerView.setAdapter(adapter); // 移除原来重复的RecyclerTouchListener代码块 } // 封装按钮显示/隐藏的方法 private void updateAddButtonVisibility(int selectedCount) { if (mMenu != null) { MenuItem addItem = mMenu.findItem(R.id.add); if (addItem != null) { addItem.setVisible(selectedCount > 0); } } }
3. 处理Activity启动时的初始状态
在onCreateOptionsMenu里初始化按钮的显示状态,并且在网络请求加载完已有选中项后,手动更新按钮:
修改onCreateOptionsMenu
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_choose_contacts_action, menu); mMenu = menu; // 保存Menu实例 if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); } // 初始化按钮显示状态:如果已有选中联系人则显示,否则隐藏 int initialSelectedCount = selectedContacts != null ? selectedContacts.size() : 0; updateAddButtonVisibility(initialSelectedCount); return true; }
网络请求完成后更新按钮
在onResponse里的延迟任务结束后,手动调用更新方法:
new Handler(Looper.getMainLooper()).postDelayed(() -> { List<Integer> selectedIndexes = new ArrayList<>(); // 查找已选中联系人的索引 for (int i = 0; i < contactList.size(); i++) { if (selectedContacts.contains(contactList.get(i).getUserId())) { selectedIndexes.add(i); } } // 触发选中项的点击事件 for (int j = 0; j < selectedIndexes.size(); j++) { recyclerView.getChildAt(selectedIndexes.get(j)).performClick(); } // 点击完成后,手动更新按钮状态 updateAddButtonVisibility(adapter.getSelectedItemCount()); }, 500);
这样修改后,就能完美实现你要的效果:
- 点击RecyclerView项切换选中状态,选中数量>0时显示右上角按钮,否则隐藏
- Activity启动时,根据已有选中联系人数量自动控制按钮显示/隐藏
内容的提问来源于stack exchange,提问作者Banana
相关产品推荐
相关产品推荐

