如何在 RecyclerView 项目更改上触发 MainActivity 映射修改

Posted

技术标签:

【中文标题】如何在 RecyclerView 项目更改上触发 MainActivity 映射修改【英文标题】:How to trigger MainActivity map modifications on RecyclerView items change 【发布时间】:2018-06-19 12:12:36 【问题描述】:

我有一个在地图上显示项目的 RecyclerView。其中一些项目存在位置,我想在地图上为它们设置标记。一旦用户滚动并且该项目不再可见,我将删除标记,然后在可能的情况下添加新标记。

这是我的地图片段初始化:

mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);

        mapFragment.getMapAsync(this);

在这里我初始化地图:

 @Override
    public void onMapReady(GoogleMap googleMap) 
        mMap = googleMap;
    

可以这样添加标记:

LatLng sydney = new LatLng(-33.852, 151.211);
googleMap.addMarker(new MarkerOptions().position(sydney)
   .title("Marker in Sydney"));

这是获取第一个和最后一个可见项目的方法:

LinearLayoutManagerlayoutManager = ((LinearLayoutManager)mRecyclerView.getLayoutManager());
int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
int lastVisiblePosition = layoutManager.findLastVisibleItemPosition();

并基于此,我将控制显示哪些标记。

不幸的是,我不知道在哪里将所有这些链接在一起。有人有什么想法吗?

【问题讨论】:

您的列表和地图是一起显示还是它们都在不同的片段或活动中,并且一次显示其中一个。 (地图或列表) 我在 MainActivity 中有列表和地图。然后在 OnCreate 我用列表初始化 RecyclerView 的适配器。它们都显示在同一个活动中,即主要活动中。 【参考方案1】:

无法完全评估您的问题。但如果它属于这些情况。

    地图和回收视图都在同一个屏幕上,这意味着用户 可以同时查看列表和地图。 List 和 Map 是两个不同的部分,显示在两个不同的部分 片段或活动。这意味着用户可以看到地图 或一次列出一个列表。

Case 1) If first is the case. - 每次使用 addOnScrollListener 获取更新的位置 滚动列表

 mRecyclverViewEvent.addOnScrollListener(new RecyclerView.OnScrollListener() 
            @Override


     public void onScrollStateChanged(RecyclerView recyclerView, int newState) 
            super.onScrollStateChanged(recyclerView, newState);
            firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
            lastVisiblePosition = layoutManager.findLastVisibleItemPosition();
            updateMapMarker();
        
    )
创建一个 updateMapMarker() 方法,删除旧标记并使用第一个和最后一个可见项目位置在地图上绘制新标记。第一个和最后一个可见项目位置将允许您从主要项目清单。

【讨论】:

案例 1 是。谢谢你。我认为滚动监听器正是我想要的。我会告诉你进展如何。 你检查了吗? 是的,它似乎确实可以完成这项工作。我只需要为第一个项目添加一些标记,因为滚动只会在滚动 xD 后触发。您是否认为快速添加和删除标记会导致性能下降问题? 虽然考虑到您在同一屏幕上显示地图和列表,但会同时显示很少的标记(取决于屏幕大小)。您将永远不会处理大量的标记删除和添加。我们可以通过以下方式对其进行改进 1)处理 newState 变量,它返回三种滚动状态(空闲、拖动、稳定) 2)可以以这种方式维护列表只有那些新的标记被添加,只有那些在列表中不再可见的被删除。因此必须为那些必须从先前列表中显示的标记找到一个交叉点 是的。我正是这样做的。它似乎没有任何问题。谢谢。

以上是关于如何在 RecyclerView 项目更改上触发 MainActivity 映射修改的主要内容,如果未能解决你的问题,请参考以下文章

Recyclerview 在滚动期间更改项目

如何使用drawable在本地更改RecyclerView中的图像

RecyclerView 在项目更改时向上滚动

如何使用实时数据从 RecyclerView 中删除项目?

如何 android recyclerview 更改不同的持有者视图背景

为 listview 或 recyclerview 更改单个项目的布局