You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:25:51