使用recycleview 实现viewpager 功能,并带有指示器。(仿高德交通路线规划实现)

这篇博客介绍了如何在Android应用中利用RecyclerView模仿高德地图的交通路线规划功能,实现了一个可动态调整的界面。内容包括:1. 水平滚动的RecyclerView配合指示器;2. 分级列表的动态更新。通过监听RecyclerView滑动,更新指示器和列表内容,实现了头部滑动与下方列表的联动。博主提供了关键代码示例,包括RecyclerView的设置和Indicator类的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中遇到了这么个需求,妈的竟然和高德地图实现一模一样的功能。因为保密性原则,我就直接上高德地图的截图了。


首先这么一步操作,输入起始点,

之后呢,就进入这个界面






看到这里,大家应该清楚我说的需求吧,好吧,不讲逻辑,单单讲一下这个界面 实现。因为数据都是动态生成的,每次搜索的结果对应的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);
  
介绍:一个基于RecyclerView实现ViewPager,支持类似于gallary的fling操作。点击上面"下载源码" 按钮,可以下载完整的demo。其中recyclerview是android-support中的依赖项目,RecyclerViewPager是主项目。运行效果:使用说明:继承自 RecyclerView.自定义 fling factor.自定义 paging trigger.支持 水平个垂直方向.支持 FragmentViewPager (api 12 )gradlecompile('com.lsjwzh:recyclerviewpager:1.0.2')xml:java:final RecyclerViewPager mRecyclerView = (RecyclerViewPager) this.findViewById(R.id.recyclerViewPager); LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);//LinearLayoutManager.HORIZONTAL 设置水平滚动 mRecyclerView.setLayoutManager(layout); //set adapter mRecyclerView.setAdapter(new MyRecyclerAdapter());static class MyRecyclerAdapter extends RecyclerView.Adapter { private List items = new ArrayList(); public MyRecyclerAdapter(){ //创建4个页面 for(int i = 1; i<5; i ){ items.add("页面" i); } } public static class ViewHolder extends RecyclerView.ViewHolder{ public ViewHolder(View itemView) { super(itemView); } } @Override public int getItemCount() { // TODO Auto-generated method stub return items.size(); } @Override public void onBindViewHolder(ViewHolder holder, int position) { String item = items.get(position); TextView msgTv = (TextView)holder.itemView.findViewById(R.id.msg); msgTv.setText(item); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(inflate == null) inflate = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = (LinearLayout)(inflate.inflate(R.layout.item, null)); return new 
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值