淘宝京东的相对简单很多,两个RecyclerView就可实现了。

现在要做的是右边滑动的时候左边跟着联动,如下图:

思路:左右肯定都是RecyclerView了,至于中间的图片嘛当然也是RecyclerView了,嵌套冲突的时代已经过去了。(如果你想用多条目,每张图片也要复用我也不反对,但你会掉头发...)

注意:嵌套的内层RecyclerView会失去复用,不适合单个分类上百张图片(是单个分类,不是总数)或一张图片需要占半屏的那种(真有有这么奇葩的分类我也无力吐槽)

其实代码不算太复杂,就是逻辑有点绕,精简炼化后的代码如下:

public class RvLianDongActivity extends BaseActivity {@BindView(R.id.rv_rvliandong_Left)RecyclerView mRvLeft;@BindView(R.id.rv_rvliandong_Right)RecyclerView mRvRight;private RvLeftAdapter mAdapterLeft;private RvRightAdapter mAdapterRight;private LinearLayoutManager mManagerLeft;private LinearLayoutManager mManagerRight;/*** 是否来自点击*/private boolean mIsFromClick = false;/*** 相当于setContentView*/@Overrideprotected int getLayouRes() {return R.layout.activity_rv_lian_dong;}/*** 相当于onCreate的初始逻辑*/@Overrideprotected void initData() {mRvLeft.setLayoutManager(new LinearLayoutManager(this));mAdapterLeft = new RvLeftAdapter(this);mRvLeft.setAdapter(mAdapterLeft);mManagerRight = new LinearLayoutManager(this);mRvRight.setLayoutManager(mManagerRight);mAdapterRight = new RvRightAdapter(this);mRvRight.setAdapter(mAdapterRight);//造数据ArrayList<String> listLeft = new ArrayList<>();ArrayList<String> listRight = new ArrayList<>();for (int i = 0; i < 20; i++) {listLeft.add("左边第" + i);listRight.add("右边第" + i);}mAdapterLeft.setListAndNotifyDataSetChanged(listLeft);//就是设置list然后刷新mAdapterRight.setListAndNotifyDataSetChanged(listRight);//监听mRvRight.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int i, int i1) {super.onScrolled(recyclerView, i, i1);if (mIsFromClick) {//防止来回调return;}changePosition();}private void changePosition() {int firstPosition = mManagerRight.findFirstVisibleItemPosition();if (mAdapterLeft.mCheckedPosition != firstPosition) {mAdapterLeft.mCheckedPosition = firstPosition;mAdapterLeft.notifyDataSetChanged();//此方法无置顶效果mRvLeft.scrollToPosition(mAdapterLeft.mCheckedPosition);}}});mAdapterLeft.setOnItemClickListener(new OnItemClickListener() {@Overrideprotected void onItemClick(View view, int listPosition) {mAdapterLeft.mCheckedPosition = listPosition;mAdapterLeft.notifyDataSetChanged();mIsFromClick = true;//不走onScrolled,防止来回调//此方法可以置顶mManagerRight.scrollToPositionWithOffset(listPosition, 0);mIsFromClick = false;//放开}});}/*** 左边,就一个tv*/public static class RvLeftAdapter extends BaseAdapterRvList<BaseViewHolder, String> {public int mCheckedPosition = 0;public RvLeftAdapter(Activity activity) {super(activity);}@Overrideprotected void onBindVH(BaseViewHolder holder, int listPosition, String s) {TextView tv = (TextView) holder.itemView;tv.setText(s);tv.setBackgroundColor(mCheckedPosition == listPosition ? 0xffeeeeee : 0xffffffff);//选中灰色,不选择白色}@NonNull@Overrideprotected BaseViewHolder onCreateVH(ViewGroup parent, LayoutInflater inflater) {TextView tv = new AppCompatTextView(mActivity);tv.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));tv.setPadding(0, 40, 0, 40);tv.setGravity(Gravity.CENTER);tv.setTextSize(15);return new BaseViewHolder(tv);}}/*** 右边tv+rv*/public static class RvRightAdapter extends BaseAdapterRvList<RvRightAdapter.ViewHolder, String> {public RvRightAdapter(Activity activity) {super(activity);}@Overrideprotected void onBindVH(ViewHolder holder, int listPosition, String s) {holder.mTvBiaoTi.setText(s);BaseAdapterRvList adapter = (BaseAdapterRvList) holder.mRv.getAdapter();ArrayList<Integer> list = new ArrayList<>();for (int i = 0; i < listPosition + 1; i++) {list.add(R.mipmap.ic_launcher);}adapter.setListAndNotifyDataSetChanged(list);//一堆机器人的图片}@NonNull@Overrideprotected ViewHolder onCreateVH(ViewGroup parent, LayoutInflater inflater) {ViewHolder holder = new ViewHolder(inflater.inflate(R.layout.adapter_liandong_right, parent, false));holder.mRv.setLayoutManager(new GridLayoutManager(mActivity, 4));//此处为了简单,直接就是图片holder.mRv.setAdapter(new BaseAdapterRvList<BaseViewHolder, Integer>(mActivity) {@Overrideprotected void onBindVH(BaseViewHolder holder, int listPosition, Integer integer) {ImageView iv = (ImageView) holder.itemView;iv.setImageResource(integer);}@NonNull@Overrideprotected BaseViewHolder onCreateVH(ViewGroup parent, LayoutInflater inflater) {ImageView iv = new AppCompatImageView(mActivity);return new BaseViewHolder(iv);}});holder.mRv.setNestedScrollingEnabled(false);//设置内层rv不可滑动return holder;}static class ViewHolder extends BaseViewHolder {@BindView(R.id.tv_liandongrightada_BiaoTi)TextView mTvBiaoTi;@BindView(R.id.rv_liandongrightada)RecyclerView mRv;ViewHolder(View view) {super(view);ButterKnife.bind(this, view);}}}
}

activity_rv_lian_dong.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/c_fff"android:gravity="center_horizontal"android:orientation="vertical"><!--标题样式可以忽略--><com.wang.mylibrary.view.ActivityHeaderViewandroid:layout_width="match_parent"android:layout_height="wrap_content"app:w_title="RV联动" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_rvliandong_Left"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1" /><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_rvliandong_Right"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="3" /></LinearLayout>
</LinearLayout>

adapter_liandong_right.xml

<?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="wrap_content"android:background="@color/c_fff"android:gravity="center_horizontal"android:orientation="vertical"><TextViewandroid:id="@+id/tv_liandongrightada_BiaoTi"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/w_c_eee"android:padding="5dp"android:text="标题" /><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_liandongrightada"android:layout_width="match_parent"android:layout_height="wrap_content" />
</LinearLayout>

想要点击左边加上惯性滑动效果?

把滑动监听和click事件改一下就行了,稍微复杂一点点:

        //监听mRvRight.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int i, int i1) {super.onScrolled(recyclerView, i, i1);if (mIsFromClick) {//防止来回调return;}changePosition();}@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);if (newState == RecyclerView.SCROLL_STATE_IDLE) {//和下面的handler配合,这样才能无bugif (mIsFromClick) {changePosition();//防止突然停了,定错位置}mIsFromClick = false;//滑动结束放开}}private void changePosition() {int firstPosition = mManagerRight.findFirstVisibleItemPosition();if (mAdapterLeft.mCheckedPosition != firstPosition) {mAdapterLeft.mCheckedPosition = firstPosition;mAdapterLeft.notifyDataSetChanged();//此方法无置顶效果mRvLeft.scrollToPosition(mAdapterLeft.mCheckedPosition);}}});mAdapterLeft.setOnItemClickListener(new OnItemClickListener() {@Overrideprotected void onItemClick(View view, int listPosition) {mAdapterLeft.mCheckedPosition = listPosition;mAdapterLeft.notifyDataSetChanged();mIsFromClick = true;//不走onScrolled,防止来回调LinearSmoothScroller topScroller = new LinearSmoothScroller(getActivity()) {@Overrideprotected int getHorizontalSnapPreference() {return SNAP_TO_START;//具体见源码注释}@Overrideprotected int getVerticalSnapPreference() {return SNAP_TO_START;//具体见源码注释}@Overrideprotected void onStop() {super.onStop();//发送一个延时handler//因为onStop时还有惯性动画TimeUtil.mHandler.postDelayed(new Runnable() {@Overridepublic void run() {mIsFromClick = false;}}, 500);}};topScroller.setTargetPosition(listPosition);mManagerRight.startSmoothScroll(topScroller);}});

关于数据格式:

我的代码是单纯为了展示效果没有格式,真正的格式应该像这样:(tb、jd不是这样的,见下面原因)

[{"title": "左标题","title2": "右标题","ohter": "其他内容","item": [{"img": "http:1","ohter2": "其他内容"}...]
}..]

这种效果又流畅又时尚为什么tb、jd都不使用?

1.tb、jd分类比较多,一次性加载全部会比较慢,影响体验,服务器压力也会变大。

2.用户基本只会点其中几个分类,其他分类即使加载了也是浪费。

3.他们的分类下还有小分类,一直滑动会容易混淆。

所以他们采用了每次点击根据左边的标题来再请求网络获得右边的数据。

置顶效果:

置顶很简单,但好多人不知道,里面也有置顶失败的例子,详细见:https://blog.csdn.net/weimingjue/article/details/82805361

BaseAdapterRvList和BaseViewHolder:

就是Adapter对list的封装简化,详细代码:https://blog.csdn.net/weimingjue/article/details/8819075

转载请注明出处:王能的博客:https://blog.csdn.net/weimingjue/article/details/102698344

Android 仿京东淘宝拼多多的商品分类,双列表联动,RecyclerView嵌套相关推荐

  1. Android 仿京东淘宝 商品详情页 商品图片效果

    最近重构商品,产品要求,按照淘宝京东来.... 成品如图这个效果 思路就是监听外边ScrollView的滑动监听,然后给上边图片设置margin,二话不说上代码 简单的界面布局 <?xml ve ...

  2. Android 仿京东淘宝多规格选择

    上图直接点,下次在修改理论,因为要下班了 这是淘宝的规格选择,我随便选择了一个,将就着看吧 然后再来看看我的效果 这个我是在CSDN上看的一篇文章 我把地址贴出来这是原文地址我是在他的基础改的 我做了 ...

  3. Android——仿京东淘宝分类页面

    效果图: json在assets下 添加依赖: compile 'com.squareup.okhttp3:okhttp:3.8.1' compile 'com.facebook.fresco:fre ...

  4. 菜鸟窝-仿京东淘宝项目学习笔记(二)ToolBar的基本使用

    本篇知识点均来自于菜鸟窝-仿京东淘宝实战项目视频中 今天继续仿京东淘宝项目的学习,第二天,学习ToolBar的基本使用,本篇记录视频中一些重要的笔记 笔记一:ToolBar的一些重要属性 xml st ...

  5. 仿京东淘宝等首页广告弹窗广告 dialog

    记录贴 防止以后忘记. 上图 1.dialog布局 图片随便找的 <?xml version="1.0" encoding="utf-8"?> &l ...

  6. 京东淘宝拼多多自动查券找券搜券返利机器人实现方法分享

    京东淘宝拼多多自动查券找券搜券返利机器人实现方法分享 一.淘客CMS网站 全面打通PC和手机端,只需简单部署一下,就可以拥有属于自己的优惠券cms淘客网站,查券返利轻松搞定 不依赖第三方,完全淘宝联盟 ...

  7. 微信小程序仿京东淘宝商品排序

    微信小程序仿京东淘宝商品排序 效果图如下所示 仿京东微信小程序视频请加QQ:1010753897 下载地址:https://download.csdn.net/download/qq_43764578 ...

  8. Android仿手机淘宝多级下拉菜单

    我们在常用的电商或者旅游APP中,例如美团,手机淘宝等等,都能够看的到有那种下拉式的二级列表菜单.具体如图所示: 上面两张图就是美团的一个二级列表菜单的一个展示.我相信很多人都想开发一个跟它一样的功能 ...

  9. Android仿支付宝淘宝 - 自定义密码输入框和键盘

    1.概述 最近有人在问我要所有项目的代码,我在这里声明一下我不是这几个项目公司内部人员,之所以录视频和写博客也是喜欢与人分享和学习而已,最终所有的代码肯定会上传的,只不过会要等全部的效果以及设计模式搞 ...

最新文章

  1. Java培训找什么样的机构比较好
  2. EF Core 数据变更自动审计设计
  3. My.Ioc 代码示例——避免循环依赖
  4. linux添加删除回环地址,CentOS7如何添加本地回环地址?CentOS7添加本地回环地址的方法...
  5. VCSA 6.5 HA配置 之四 开启vCenter HA
  6. python——extend用新序列扩展其他列表
  7. Jquery、简单的下拉列表、网页左部导航菜单
  8. apache服务上配置https安全与域名请求
  9. SVN安装配置以及启动
  10. python tkinter教程-事件绑定_详解python tkinter教程-事件绑定
  11. java中下标和标识符_如下哪个是 Java 中的标识符 ( )_学小易找答案
  12. 修真院教学模式三大阶段之任务体系
  13. mysql同城双活以及主从库方案
  14. 跨境电商“独立站”新风口丨从0-1答疑解惑篇
  15. update和delete详解
  16. anacoda里面安装包显示失败_Premiere2020安装包下载及安装教程(附pr2020配置要求)...
  17. [原文] Application of Polarization Imaging Techniques in Brain Tumor Detection 偏振成像技术在脑肿瘤检测中的应用
  18. 学习C++该看什么书?
  19. 传奇开服教程:传奇开服技术要学多久?好学嘛?
  20. 边吃烧烤边喝啤酒引发疾病

热门文章

  1. CentOS4_EP2_防火墙端口配置
  2. c语言程序设计足球,使用C语言计算与模拟足球射门.doc
  3. 一直激励自己的几句话
  4. 近年全球网络安全领域投融资整体特点
  5. 如何用Photoshop制作iOS 7透明磨砂玻璃效果
  6. 使用会声会影X4把录制的视频成90度旋转
  7. XLN Audio Addictive Drums 2 Mac(完整ADD鼓音源插件)
  8. linux u盘加载硬盘驱动,在linux下加载U盘或移动硬盘
  9. 无线局域网如何设置更安全?
  10. 使用matplotlib python数据可视化系列创建3d视频可视化