最近项目中遇到了这么个需求,妈的竟然和高德地图实现一模一样的功能。因为保密性原则,我就直接上高德地图的截图了。
首先这么一步操作,输入起始点,
之后呢,就进入这个界面
看到这里,大家应该清楚我说的需求吧,好吧,不讲逻辑,单单讲一下这个界面 实现。因为数据都是动态生成的,每次搜索的结果对应的list的大小和内容都是不一样的,所以呢,我们做这个界面的时候,也需要遵循数据源定的游戏规则,我们界面上也要做成动态的。并且是可复用的,这样不论是在操作还是性能上,都会很好。
这个布局主要分两大部分,
1,头部的水平recycle +指示器
2,头部以下的分级列表
好,分析完大的结构,然后我们再来看一下他们的关系,头部的滑动,会影响到下面列表内容的展示,实施更新对应的数据。
所以我们需要对recycle 的滑动做监听,目的是有两个:1,及时更新指示器 ; 2,及时更新分级列表内容。
下面分享一下我个人这个界面的实现过程。将Recycleview 设置成水平滑动模式,很简单,就这么一句话。
hLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(hLinearLayoutManager);恩,这就实现了水平滑动,但是单单实现水平滑动是不够的,滑动的距离要是一个item 的宽度才行,这样才能像高仿的viewpager。那么很关键的东西出现了。Scroller ,处理recycle滑动分页的工具类。我们自定义的Scorller 继承于recycleview 的onscroollIstener。
最开始是看到这位兄台的博客得到的灵感:一行代码让RecyclerView变身ViewPager
因为他没有实现 指示器的功能,所以我在他的基础上,把指示器添加了进来。下面是我自己的Scroller:
public class PagingScrollHelper { RecyclerView mRecyclerView = null; private RouteTopAdapter myAdapter = null; private MyOnScrollListener mOnScrollListener = new MyOnScrollListener(); private MyOnFlingListener mOnFlingListener = new MyOnFlingListener(); private int offsetY = 0; private int offsetX = 0; int startY = 0; int startX = 0; private PageIndicatorView mIndicatorView = null; private int index = 0; private int totalPage = 0; enum ORIENTATION { HORIZONTAL, VERTICAL, NULL } ORIENTATION mOrientation = ORIENTATION.HORIZONTAL; public void setUpRecycleView(RecyclerView recycleView) { if (recycleView == null) { throw new IllegalArgumentException("recycleView must be not null"); } mRecyclerView = recycleView; //处理滑动 recycleView.setOnFlingListener(mOnFlingListener); //设置滚动监听,记录滚动的状态,和总的偏移量 recycleView.setOnScrollListener(mOnScrollListener); //记录滚动开始的位置 recycleView.setOnTouchListener(mOnTouchListener);