双列表联动效果如下:

以上,是博主根据鸿洋大神的玩Android开放的API做的一个客户端,其中导航界面使用了双列表联动来展示数据。

一、前期基础知识储备

1.使用强大的开源项目BRVAH装载两个列表的数据,简单易用,强烈推荐使用;

2.RecyclerView的滚动事件OnScrollListener研究 - 监听列表滚动状态的接口为 RecyclerView.OnScrollListener

注册接口的方法有两个:

1).setOnScrollListener(OnScrollListener listener) ,可能会有空指针问题,已经被废弃。

2).addOnScrollListener(OnScrollListener listener)

3.OnScrollListener类是个抽象类,有两个方法:

void onScrollStateChanged(RecyclerView recyclerView, int newState): 滚动状态变化时回调

recyclerView: 当前在滚动的RecyclerView

newState: 当前滚动状态 void onScrolled(RecyclerView recyclerView, int dx, int dy): 滚动时回调

recyclerView : 当前滚动的view

dx : 水平滚动距离

dy : 垂直滚动距离

dx > 0 时为手指向左滚动,列表滚动显示右面的内容

dx < 0 时为手指向右滚动,列表滚动显示左面的内容

dy > 0 时为手指向上滚动,列表滚动显示下面的内容

dy < 0 时为手指向下滚动,列表滚动显示上面的内容

4.RecycleView4种定位滚动方式演示

1)recyclerView.scrollBy(x, y),这个方法是自己去控制移动的距离,单位是像素;

2)recyclerView.scrollToPosition(position),这个方法的作用是定位到指定项,就是把你想显示的项显示出来,但是在屏幕的什么位置是不管的,只要那一项现在看得到了,那它就罢工了;

3)recyclerView.smoothScrollToPosition(position),smoothScrollToPosition(position)scrollToPosition(position)效果基本相似,也是把你想显示的项显示出来,只要那一项现在看得到了,那它就罢工了,不同的是smoothScrollToPosition是平滑到你想显示的项,而scrollToPosition是直接定位显示;

4)((LinearLayoutManager)recyclerView.getLayoutManager()).scrollToPositionWithOffset(position,0);主角总是最后才登场,这种方式是定位到指定项如果该项可以置顶就将其置顶显示。比如:微信联系人的字母索引定位就是采用这种方式实现。

二、上代码,具体实现

1.在布局中放入两个RecyclerView,左右各一个;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/trans"android:orientation="horizontal"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclervie_left"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginBottom="20dp"android:layout_weight="1"android:background="@color/trans" /><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclervie_right"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3.5"android:background="@color/trans" /></LinearLayout>

2.使用BRVAH开源项目,做好两个列表的适配器;

①右边的列表适配器:

public class RightAdapter extends BaseQuickAdapter<GuideBean.DataBean, BaseViewHolder> {public RightAdapter(int layoutResId) {super(layoutResId);}@Overrideprotected void convert(BaseViewHolder holder, GuideBean.DataBean item) {holder.getView(R.id.tv_item_tixi).setVisibility(View.GONE); // 右侧列表不为item设立标题TagFlowLayout tfl = holder.getView(R.id.tfl);ArrayList<String> mVals = new ArrayList<>();for (int i = 0; i < item.getArticles().size(); i++) {mVals.add(item.getArticles().get(i).getTitle());}tfl.setAdapter(new TagAdapter<String>(mVals) {@Overridepublic View getView(FlowLayout parent, int position, String s) {Random random = new Random();int r = random.nextInt(150);int g = random.nextInt(150);int b = random.nextInt(150);TextView tv = (TextView) LayoutInflater.from(mContext).inflate(R.layout.tfl, tfl, false);tv.setTextColor(Color.rgb(r, g, b));tv.setText(s);return tv;}});tfl.setOnTagClickListener((view, position, parent) -> {Intent intent = new Intent(mContext, WebViewActivity.class);intent.putExtra("link", item.getArticles().get(position).getLink());mContext.startActivity(intent);Log.d(TAG, "getView: " + item.getArticles().get(position).getLink() + "," + position);return false;});}
}

②左边的列表适配器:

public class LeftAdapter extends BaseQuickAdapter<GuideBean.DataBean, BaseViewHolder> {private ArrayList<Boolean> selected = new ArrayList<>();private int position;public ArrayList<Boolean> getSelected() {return selected;}public LeftAdapter(int layoutResId) {super(layoutResId);}@Overrideprotected void convert(BaseViewHolder holder, GuideBean.DataBean item) {holder.setText(R.id.tv_title, item.getName());holder.setBackgroundColor(R.id.view, holder.getLayoutPosition() == position ? Color.parseColor("#ffffff") : Color.parseColor("#363636"));}public void setSelect(ArrayList<Boolean> booleans) {this.selected = booleans;notifyDataSetChanged();}public void setSelection(int pos) {Log.d(TAG, "setSelection: " + pos);this.position = pos;notifyDataSetChanged();}
}

3.使用OKGO请求网络数据,同时填充两个适配器:

private void getData() {OKGO.get(Constants.NAVIURL, "navifragment", new StringCallback() {@Overridepublic void onSuccess(Response<String> response) {GuideBean resultBean = JSONObject.parseObject(response.body(), GuideBean.class);int errorCode = resultBean.getErrorCode();if (errorCode == 0) {articlesBeanList = new ArrayList<>();dataBeanList = resultBean.getData();for (int i = 0; i < dataBeanList.size(); i++) {articlesBeanList.addAll(dataBeanList.get(i).getArticles());}leftAdapter = new LeftAdapter(R.layout.item_text);rv1.setAdapter(leftAdapter);leftAdapter.setNewData(dataBeanList);rightAdapter = new RightAdapter(R.layout.item_tixi);rv2.setAdapter(rightAdapter);if (dataBeanList != null) {rightAdapter.setNewData(dataBeanList);}... ...@Overridepublic void onError(Response<String> response) {super.onError(response);}@Overridepublic void onFinish() {super.onFinish();}});}

4.写入双列表联动的控制;

点击左边列表,右边列表进行滑动

                    leftAdapter.setOnItemClickListener((adapter, view, position) -> {leftAdapter.setSelection(position);LinearLayoutManager layoutManager = (LinearLayoutManager) rv2.getLayoutManager();... ...//根据左侧,定位右侧的展示数据layoutManager.scrollToPositionWithOffset(position, 0); // 定位到某个item,并将其置顶显示});

滑动右侧列表,左侧列表进行联动

                    rv2.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);//获取滚动时的第一条展示的positionLinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();int position = 0;for (int i = 0; i < firstVisibleItemPosition; i++) {position += dataBeanList.get(i).getArticles().size();}//获取右侧数据的关联idGuideBean.DataBean.ArticlesBean articlesBean = articlesBeanList.get(position);int outId = articlesBean.getChapterId();//记录外部id, 更新左侧状态栏状态int pos = 0;for (int i = 0; i < dataBeanList.size(); i++) {int id = dataBeanList.get(i).getCid();if ((outId == id)) {pos = i;}}leftAdapter.setSelection(pos);rv1.smoothScrollToPosition(pos);}});} 

这里比较关键,首先我们需要获取右侧列表第一个Item项的位置,然后获取它的一个索引值,与左侧列表的索引值进行比较,看看某个属性会相等,相等则说明,右侧列表项归属于某个左侧列表项。这个属性由鸿洋大神提供的API返回的JSON数据可知为:

左侧列表属性:cid,一个int类型的值;

右侧列表属性:chapterId,一个int类型的值。

只要两个值相等,则判定左侧的列表需要进行滑动。

另外推荐一个已开源的双列表联动的项目:

Linkage-RecyclerView

RecyclerView双列表联动相关推荐

  1. Android双列表联动和固定头部ScrollView效果实现

    引文: 之前在写一个stickScrollView的时候对不少人有一定的启示作用,这次针对stickScrollView再实现双列表的联动效果,希望对后续的开发者要实现同样的效果能有一定的启示,在实现 ...

  2. Android 仿京东淘宝拼多多的商品分类,双列表联动,RecyclerView嵌套

    淘宝京东的相对简单很多,两个RecyclerView就可实现了. 现在要做的是右边滑动的时候左边跟着联动,如下图: 思路:左右肯定都是RecyclerView了,至于中间的图片嘛当然也是Recycle ...

  3. 仿饿了么,百度外卖这些App的双ListView列表联动效果

    仿饿了么,百度外卖这些App的双列表联动效果 思路: 1.自定义一个悬浮条目且带移动替换效果的ListView. 2.在界面中左边是个普通的ListView,右边是我们自定义带效果的ListView. ...

  4. 使用 RecyclerView 做点餐列表联动页面

    使用 RecyclerView 做点餐列表联动页面 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近刚换了工作,来到一家做了11年餐饮软件管理的公司,开发平板端点餐安卓端原生app.因为之前 ...

  5. Android股票列表联动

    使用ScrollerView+RecycleView实现股票列表联动效果:一个可以拿来可以直接使用的解决方案,而且滑动流畅,带标题栏悬浮功能,支持整行的点击效果,支持长安事件: 效果如下图所示: 实现 ...

  6. 【FastAdmin专题一】使用双表格联动实现字典管理之修改表格原始样式

    多读多写多记录,多学多练多思考.---------- Banana.Banuit Gang(香柚帮) 字典管理首页截图如下: 左边的一排按钮可以直接在html页面隐藏 index.html<st ...

  7. android开发 RecyclerView 瀑布列表布局

    android开发 RecyclerView 瀑布列表布局 1.写一个内容的自定义小布局: <?xml version="1.0" encoding="utf-8& ...

  8. android开发实现选择列表,Android使用RecyclerView实现列表数据选择操作

    Android使用RecyclerView实现列表数据选择操作 发布时间:2020-08-31 17:50:13 来源:脚本之家 阅读:76 作者:迟做总比不做强 这些时间做安卓盒子项目,因为安卓电视 ...

  9. 安卓实现饿了么点餐界面效果(京东类别左右列表联动)

    没有效果图的示例简直就是扯淡 通过两个RecyclerView实现左右联动,吸附的标题通过自定义分割线view实现 源码在最下面

最新文章

  1. 【重学Vue】数据响应原理真的是双向绑定吗?
  2. 【模电基础】滤波电容的选择
  3. 测试计算机操作基础知识,计算机病毒基础知识测试
  4. Windows下使用python库 curses遇到错误消息的解决方案
  5. 前端接入HTTP协议浅析
  6. winform数据传递到html,C#下winform和JS的互相调用和传参(webbrowser)
  7. 线段树 B数据结构 牛客练习赛28
  8. JSP幼儿园管理系统
  9. MongoDB实验——数据库基本操作(头歌)
  10. 计算机控屏教程,电脑怎么控制手机操作
  11. Package inputenc Error: Invalid UTF-8 byte “A1;Improper alphabetic constant. <to be read again>
  12. Excel的单元格设置下拉选项并填充颜色
  13. H5:使用video标签在页面中插入视频
  14. 云班课python答案_云班课 答案 脚本
  15. java知识精华总结
  16. OI生涯回忆录(Part3:至初三NOIP发成绩)
  17. 齐岳钹形|UFO形|花生形|碗形Janus PS聚合物微球
  18. 神经网络训练失败原因总结
  19. Codeforces 605E :Intergalaxy Trips
  20. 私人定制情人节告白网站并且部署上线,谁说程序员没有爱!超详细步骤!源码分享!

热门文章

  1. 人月神话 - 人与月
  2. 4p营销组合策略案例_营销4P到底是什么?理解营销4P订定你的营销策略架构
  3. Php字符拼出心形,怎么用文字拼成心形?名字心形图案怎么做?文字拼成一个爱心怎么制作?告白图片制作...
  4. 一体化会是未来商业的核心
  5. 关于CPU漏洞的思考——别太把自己当回事
  6. “5G+电力”四大应用场景发布!
  7. android 多点下载地址,多点app下载安装多点
  8. ES6学习(变量解构赋值)
  9. 联易融遭做空背后:严重依赖房地产领域客户,股价已然“腰斩”
  10. 操作系统安装及初始化规范