RecyclerView双列表联动
双列表联动效果如下:
以上,是博主根据鸿洋大神的玩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双列表联动相关推荐
- Android双列表联动和固定头部ScrollView效果实现
引文: 之前在写一个stickScrollView的时候对不少人有一定的启示作用,这次针对stickScrollView再实现双列表的联动效果,希望对后续的开发者要实现同样的效果能有一定的启示,在实现 ...
- Android 仿京东淘宝拼多多的商品分类,双列表联动,RecyclerView嵌套
淘宝京东的相对简单很多,两个RecyclerView就可实现了. 现在要做的是右边滑动的时候左边跟着联动,如下图: 思路:左右肯定都是RecyclerView了,至于中间的图片嘛当然也是Recycle ...
- 仿饿了么,百度外卖这些App的双ListView列表联动效果
仿饿了么,百度外卖这些App的双列表联动效果 思路: 1.自定义一个悬浮条目且带移动替换效果的ListView. 2.在界面中左边是个普通的ListView,右边是我们自定义带效果的ListView. ...
- 使用 RecyclerView 做点餐列表联动页面
使用 RecyclerView 做点餐列表联动页面 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近刚换了工作,来到一家做了11年餐饮软件管理的公司,开发平板端点餐安卓端原生app.因为之前 ...
- Android股票列表联动
使用ScrollerView+RecycleView实现股票列表联动效果:一个可以拿来可以直接使用的解决方案,而且滑动流畅,带标题栏悬浮功能,支持整行的点击效果,支持长安事件: 效果如下图所示: 实现 ...
- 【FastAdmin专题一】使用双表格联动实现字典管理之修改表格原始样式
多读多写多记录,多学多练多思考.---------- Banana.Banuit Gang(香柚帮) 字典管理首页截图如下: 左边的一排按钮可以直接在html页面隐藏 index.html<st ...
- android开发 RecyclerView 瀑布列表布局
android开发 RecyclerView 瀑布列表布局 1.写一个内容的自定义小布局: <?xml version="1.0" encoding="utf-8& ...
- android开发实现选择列表,Android使用RecyclerView实现列表数据选择操作
Android使用RecyclerView实现列表数据选择操作 发布时间:2020-08-31 17:50:13 来源:脚本之家 阅读:76 作者:迟做总比不做强 这些时间做安卓盒子项目,因为安卓电视 ...
- 安卓实现饿了么点餐界面效果(京东类别左右列表联动)
没有效果图的示例简直就是扯淡 通过两个RecyclerView实现左右联动,吸附的标题通过自定义分割线view实现 源码在最下面
最新文章
- 【重学Vue】数据响应原理真的是双向绑定吗?
- 【模电基础】滤波电容的选择
- 测试计算机操作基础知识,计算机病毒基础知识测试
- Windows下使用python库 curses遇到错误消息的解决方案
- 前端接入HTTP协议浅析
- winform数据传递到html,C#下winform和JS的互相调用和传参(webbrowser)
- 线段树 B数据结构 牛客练习赛28
- JSP幼儿园管理系统
- MongoDB实验——数据库基本操作(头歌)
- 计算机控屏教程,电脑怎么控制手机操作
- Package inputenc Error: Invalid UTF-8 byte “A1;Improper alphabetic constant. <to be read again>
- Excel的单元格设置下拉选项并填充颜色
- H5:使用video标签在页面中插入视频
- 云班课python答案_云班课 答案 脚本
- java知识精华总结
- OI生涯回忆录(Part3:至初三NOIP发成绩)
- 齐岳钹形|UFO形|花生形|碗形Janus PS聚合物微球
- 神经网络训练失败原因总结
- Codeforces 605E :Intergalaxy Trips
- 私人定制情人节告白网站并且部署上线,谁说程序员没有爱!超详细步骤!源码分享!
热门文章
- 人月神话 - 人与月
- 4p营销组合策略案例_营销4P到底是什么?理解营销4P订定你的营销策略架构
- Php字符拼出心形,怎么用文字拼成心形?名字心形图案怎么做?文字拼成一个爱心怎么制作?告白图片制作...
- 一体化会是未来商业的核心
- 关于CPU漏洞的思考——别太把自己当回事
- “5G+电力”四大应用场景发布!
- android 多点下载地址,多点app下载安装多点
- ES6学习(变量解构赋值)
- 联易融遭做空背后:严重依赖房地产领域客户,股价已然“腰斩”
- 操作系统安装及初始化规范