先上效果:

这个效果是,仿京东分类效果,的基础上实现右侧滚动左侧也跟着变化的效果。

想做这个的时候百度了一下,发现其他解决方案需要第三方。
我不想下第三方浪费时间。
于是老子手写了一个原生的。
于是浪费了更多时间。
。。。。。。。。。。。。。。
浪费时间的原因主要是有坑。(解决坑的方法在本帖最后部分。)

而且加载过多数据的时候(例如几千条几万条子view)可能会卡,但是一般的轻量级的项目,加载listview的子view只有几百条几十条的时候就可以用此方法了。

(以我22年的单身命名法:)左边的listview先称他为小左,右边的listview称他为小右,方便叙述,下同

首先说一下我的思路

大题思路是这样的。先设置左边向右边的联动。很简单,利用小左的onItemClickListener和小右的setSelection就可以。这俩方法不会的问度娘娘或谷哥哥。

然后在设置右边向左边的联动,这个我是这样做的,先重写小左的数据源,重写后为List嵌套map集合的list:
先声明个这么个玩意:

private Map<String, Object> mapBool;

重写:

private void reWriteList() {//categoriesBeanList是小左的未重写数据源for (int i = 0; i < categoriesBeanList.size(); i++) {mapBool = new HashMap<>();mapBool.put("bool", false);//是否高亮显示的标识mapBool.put("cate", categoriesBeanList.get(i));list.add(mapBool);}}

重写后小左的数据源就是List嵌套参数是string和object的map的list集合了。呵呵。

然后再为小右设置onScrollListener,在小右的onScroll方法中将小左的
重写后的数据源中的标识map都射为false,然后将小左的相应位置(就是小右滚动到当前的第一项)的标识map射为true,射的有点不明白了,自己看代码:

 listViewR.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}@Overridepublic void onScroll(AbsListView view, final int firstVisibleItem, int visibleItemCount, int totalItemCount) {allFalse();//一个循环将list中map的bool全设置为falselist.get(firstVisibleItem).put("bool", true);adapter.notifyDataSetChanged();}});

allFalse():

//谁也不行高亮之都给我低调:
for (int i = 0; i < categoriesBeanList.size(); i++) {list.get(i).put("bool", false);}

也就是说,最关键的思路就是每次小右滚动的时候,都重写小左的数据源,将想要高亮显示的子view的位置的标识map射为true。
然后在adapter中判断,如果为true就高亮显示,否则就置为原来的状态。
adapter中在getview中的关键代码:

//该声明的先声明啊:bool为boolean类型,cate那个玩意就是cate那个玩意的类型。(一个bean而已)
categoriesBean = (CategoriesBean) list.get(position).get("cate");bool = (Boolean) list.get(position).get("bool");holder.textView.setText(categoriesBean.getName());if (bool == true) {holder.viewRed.setVisibility(View.VISIBLE);holder.textView.setBackgroundColor(context.getResources().getColor(R.color.colorWhite));} else {holder.viewRed.setVisibility(View.GONE);holder.textView.setBackgroundColor(context.getResources().getColor(R.color.colorGray));}

我知道我的表达不太明郎,不太清晰,毕竟不会与人交流,因为我是一只单身22年的单身狗,汪汪。

上个源代码就全明白了你们:

一开始布局文件的时候是这样的

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ui.fenleifragment.FenleiItem.SingleProduct.Singleproduct"><ListView
            android:id="@+id/single_leftlv"android:layout_width="110dp"android:layout_height="match_parent"></ListView><ListView
            android:id="@+id/single_rightlv"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_toRightOf="@id/single_leftlv"></ListView>
</RelativeLayout>

小左的adapter:

//SingleProductLVAdapterL就是小左的adapter
public class SingleProductLVAdapterL extends BaseAdapter {private List<Map<String, Object>> list;private Context context;private CategoriesBean categoriesBean;private Boolean bool;public SingleProductLVAdapterL(List<Map<String, Object>> list, Context context) {this.list = list;this.context = context;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position).get("cate");}@Overridepublic long getItemId(int position) {return position;}//这算是一个viewholder的实例声明myViewHolder holder=null;@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.single_leftlv_item, null);holder=new myViewHolder();holder.textView = (TextView) convertView.findViewById(R.id.leftLvItem_tv);holder.viewRed = convertView.findViewById(R.id.leftLvItem_V);//小左的高亮显示时候的红色竖线,小红convertView.setTag(holder);} else {holder = (myViewHolder) convertView.getTag();}categoriesBean = (CategoriesBean) list.get(position).get("cate");bool = (Boolean) list.get(position).get("bool");holder.textView.setText(categoriesBean.getName());if (bool == true) {//高亮显示之亮瞎我的单身狗眼:holder.viewRed.setVisibility(View.VISIBLE);holder.textView.setBackgroundColor(context.getResources().getColor(R.color.colorWhite));} else {//其他的不高亮显示之。。。。。。不高亮显示:holder.viewRed.setVisibility(View.GONE);holder.textView.setBackgroundColor(context.getResources().getColor(R.color.colorGray));}return convertView;}//这是一个ViewHolder(废特么话)private class myViewHolder {TextView textView;View viewRed;}
}

小右的adapter:

随便写一个奥,乖。

逻辑代码:

//一堆声明
//吧啦吧啦@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentView view = inflater.inflate(R.layout.fragment_singleproduct, container, false);initView(view);return view;}
//初始化private void initView(View view) {//一些初始化而已setadapter什么玩意的。
}
//.............................
//.......省略一堆巴拉巴拉哈.......
//.............................//mvp中的获取数据成功方法@Overridepublic void onVerticalSuccess(SingleProduct singleproduct) {//获取成功后,重新通知adaptercategoriesBeanList.clear();categoriesBeanList.addAll(singleproduct.getData().getCategories());adapter.notifyDataSetChanged();adapterR.notifyDataSetChanged();Log.i("single", "success:" + singleproduct.getData().getCategories().size());//重写、设置小左的点击事件、设置小右的滚动事件reWriteList();setOnSelectListener();setOnScrollListener();}
//小左的点击事件private void setOnSelectListener() {listViewL.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//categoriesBeanList就是小左的数据源list//viewRed是小左点击后子view中的最左边的红色竖线for (int i = 0; i < categoriesBeanList.size(); i++) {viewRed = listViewL.getChildAt(i).findViewById(R.id.leftLvItem_V);viewRed.setVisibility(View.GONE);listViewL.getChildAt(i).setBackgroundColor(getResources().getColor(R.color.colorGray));}allFalse();//一个循环将list中map的bool全设置为false//单身22年手指之点谁谁亮:list.get(position).put("bool", true);//卧槽亮了adapter.notifyDataSetChanged();viewRed = view.findViewById(R.id.leftLvItem_V);viewRed.setVisibility(View.VISIBLE);//单身22年之设谁谁滚:(设置的设而已啊)listViewR.setSelection(position);//卧槽滚了}});}//设置右侧小右的滑动事件private void setOnScrollListener() {listViewR.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}@Overridepublic void onScroll(AbsListView view, final int firstVisibleItem, int visibleItemCount, int totalItemCount) {allFalse();//老规矩//单身22年滚床单之滚谁谁亮list.get(firstVisibleItem).put("bool", true);//卧槽又亮了adapter.notifyDataSetChanged();}});}//重写list方法private void reWriteList() {//categoriesBeanList是小左的数据源for (int i = 0; i < categoriesBeanList.size(); i++) {mapBool = new HashMap<>();mapBool.put("bool", false);mapBool.put("cate", categoriesBeanList.get(i));list.add(mapBool);}}//重写list,全置灰private void allFalse() {for (int i = 0; i < categoriesBeanList.size(); i++) {list.get(i).put("bool", false);}}

君以为这样就行了????
nonono,你会发现设置了小右的滑动事件,小左的点击事件就不好使了,把小右的滑动事件取消,小左的点击事件又好使了,我说小左小右这俩女朋友都跟我22年了还打什么仗啊?于是我就调解,特么调了小一天又射flag又射坚挺的,哦是设置flag设置监听什么的,都不管用。于是根据我单身22年的第六感把布局这么改了一下,就好使了:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ui.fenleifragment.FenleiItem.SingleProduct.Singleproduct"><LinearLayout
        android:id="@+id/singlep_leftll"android:layout_width="110dp"android:layout_height="match_parent"><ListView
            android:id="@+id/single_leftlv"android:layout_width="110dp"android:layout_height="match_parent"></ListView></LinearLayout><LinearLayout
        android:layout_width="match_parent"android:layout_height="match_parent"android:layout_toRightOf="@id/singlep_leftll"><ListView
            android:id="@+id/single_rightlv"android:layout_width="match_parent"android:layout_height="match_parent"></ListView></LinearLayout></RelativeLayout>

原来是没戴套的原因啊,给小左小右带个LinearLayout套就好了。。。。。。

京东QQ都没有的牛轰特效、两个ListView联动效果,不用stickyheaderlistview,相关推荐

  1. 上海都有哪些牛逼的互联网公司?

    作者:墨菲 来源:https://zhuanlan.zhihu.com/p/191577083 上一篇: 成都都有哪些牛逼的互联网公司? 今天来归纳一下上海都有哪些牛逼的互联网公司? 第一梯队:六巨头 ...

  2. 手机京东菜单html,jQuery仿京东商城手机端商品分类滑动切换特效

    jQuery仿京东商城手机端商品分类滑动切换特效 一款仿京商城东手机移动端商品图片分类导航滑动效果,jQuery商品二级分类菜单切换特效. js代码 //设置cookie function setCo ...

  3. 电脑版和手机版QQ都要手机版QQ扫描二维码登录?

    是的,电脑版和手机版 QQ 都需要使用手机版 QQ 扫描二维码登录.这是因为扫描二维码登录是 QQ 的安全认证方式之一.

  4. Android模仿QQ的左右滑动切换界面和下拉更新的效果

    转自http://www.linuxidc.com/Linux/2012-08/67207.htm 主布局main.xml <?xml version="1.0" encod ...

  5. Android 仿新版QQ的tab下面拖拽标记为已读的效果

    可拖拽的红点,(仿新版QQ,tab下面拖拽标记为已读的效果),拖拽一定的距离可以消失回调. GitHub:DraggableFlagView(https://github.com/wangjiegul ...

  6. Java黑皮书课后题第7章:***7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能相互攻击(没有两个皇后在同行、同列、同一对角线)。编写程序显示一个解决方案

    7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能相互攻击(没有两个皇后在同行.同列.同一对角线).编写程序显示一个解决方案 题目 题目描述 破题 题目 题目描述 ...

  7. android 滑动缩放监听,基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放...

    基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放 基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放和透明效果) 在上一个项目的基础上做修改,项目 ...

  8. 鼠标点击特效:canvas点击效果

    JS代码(代码中包含了sketch.min.js的源码,如果你的网站已经引用了,请删掉下面的6到7行.): /** 鼠标点击特效:canvas点击效果*/ /* Copyright (C) 2013 ...

  9. .验证哥德巴赫猜想,哥德巴赫猜想的内容是:任何一个大于2的偶数都能写成写成两个素数和的形式。 设计一个函数 int isPrime(int n)判断n是否为素数,如果n是素数,函数返回值1,否则返

    .验证哥德巴赫猜想,哥德巴赫猜想的内容是:任何一个大于2的偶数都能写成写成两个素数和的形式. 设计一个函数 int isPrime(int n)判断n是否为素数,如果n是素数,函数返回值1,否则返回0 ...

  10. Javascript特效之动画下拉效果

    Javascript特效之动画下拉效果 今天来看看怎么实现好看的动画下拉框效果. 效果图: 点击按钮会呈现动画效果下拉获取缩回. 实现思路: 就是在div里面加一个p元素存放文字.在点击按钮是使用jq ...

最新文章

  1. Python 3.8即将发布,这几个变化你必须知道
  2. 职场不需要中年,但中年需要职场
  3. DDD-EF-数据仓储
  4. 静态页转换平台(StaticPol)-静态页生成终极解决方案
  5. 轧机用弹性阻尼体反力计算_三个典型的阻尼模型及相关理论
  6. list 根据某个数字所在位置_富玩车穷玩表,一个案例轻松认识python列表List——计算Hadamard 乘积...
  7. 使用C++实现DPCM编码(左向预测8bit、4bit、2bit、1bit和上向预测8bit)(更新过)
  8. 如果用户的计算机在查询本地Net,网络操作系统管理2448-2
  9. 《Iterative-GAN》的算法伪代码整理
  10. 暴力——猜数字(hdu1172)
  11. tshark查看、指定网卡
  12. “征信修复”可信吗?企查查显示信用修复相关企业超1.7万家
  13. 杭电 看归并排序和快速排序
  14. 【离散数学】集合论 第四章 函数与集合(2) 特殊函数类(单射、满射、双射及其性质、常/恒等函数、置换/排列)
  15. python内置高级数据结构
  16. .net反编译工具Reflector下载
  17. 使用 processon 画 UML 图
  18. 一部火了20年的音乐剧,到底有何魅力?
  19. 2022前端面试题上岸手册-浏览器部分
  20. 企业级BOM系统与外部系统集成的几种方案

热门文章

  1. 远程桌面连接不能复制粘贴怎么办 远程控制电脑无法复制粘贴的解决方法
  2. matlab中如何定义局部变量,matlab局部变量定义 persistent
  3. MADRL(多智能体深度强化学习)
  4. office2016激活后仍然出现输入激活码
  5. 来自一个曾经200斤现在140斤程序员的减肥成功经验(包含个人认为相对安全的饮食法推荐)
  6. oracle 游离块修复,求助讨论---上颌单侧后牙游离缺失的修复
  7. A股市场,价投者眼中的10大金股,值得收藏(名单)
  8. SPI 总线3-line、4-line的定义
  9. 单片机c语言设计奥运五环,如何用C语言程序来设计奥运五环图案.doc
  10. 外汇EA量化真的可以赚钱吗?还是新型骗局?