Android Java中点击AlertDialog内RecyclerView如何让嵌套RecyclerView滚动到指定分类
实现方案
核心思路
通过回调接口实现Dialog和主Activity的通信,拿到选中分类的对应位置后,调用主页面外层分类RecyclerView的滚动方法即可。
具体实现步骤
- 第一步:定义分类选择回调接口
// 可单独定义也可写在Dialog工具类内部 public interface OnCategorySelectListener { void onCategorySelected(int categoryPosition); }
- 第二步:主Activity实现该回调接口,处理滚动逻辑
public class MainActivity extends AppCompatActivity implements OnCategorySelectListener { // 声明主页面外层分类RecyclerView和对应的布局管理器 private RecyclerView outerCategoryRv; private LinearLayoutManager outerLayoutManager; // 外层分类数据列表,为你业务侧原有维护的数据 private List<Category> categoryList; // ... 原有初始化、页面生命周期等代码 @Override public void onCategorySelected(int targetPosition) { // 校验位置合法性 if (targetPosition < 0 || targetPosition >= categoryList.size()) { return; } // 方式1:直接跳转到对应位置,无动画 // outerCategoryRv.scrollToPosition(targetPosition); // 方式2:平滑滚动到对应位置 outerLayoutManager.smoothScrollToPosition(outerCategoryRv, null, targetPosition); // 方式3:直接跳转到对应位置且完全置顶,无动画 // outerLayoutManager.scrollToPositionWithOffset(targetPosition, 0); } }
- 第三步:给Dialog内的分类RecyclerView设置条目点击事件,触发回调
// 构建AlertDialog的代码片段 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); View dialogView = LayoutInflater.from(this).inflate(R.layout.dialog_category_list, null); RecyclerView dialogCategoryRv = dialogView.findViewById(R.id.dialog_category_rv); // 初始化Dialog里的分类Adapter DialogCategoryAdapter dialogAdapter = new DialogCategoryAdapter(categoryList); // 设置条目点击事件 dialogAdapter.setOnItemClickListener((view, position) -> { // 触发回调,通知主Activity滚动 onCategorySelected(position); dialog.dismiss(); }); dialogCategoryRv.setAdapter(dialogAdapter); dialogCategoryRv.setLayoutManager(new LinearLayoutManager(this)); builder.setView(dialogView); AlertDialog dialog = builder.create(); dialog.show();
注意事项
- 如果分类列表会动态增删,不要直接传递position,改为传递分类的唯一ID,主Activity收到ID后遍历本地分类列表找到对应的下标再滚动,避免位置错位
- 如果外层分类RecyclerView使用的是GridLayoutManager/StaggeredGridLayoutManager,上述滚动方法同样适用
内容的提问来源于stack exchange,提问作者Soumyo Deepto
相关产品推荐
相关产品推荐

