京东QQ都没有的牛轰特效、两个ListView联动效果,不用stickyheaderlistview,
先上效果:
这个效果是,仿京东分类效果,的基础上实现右侧滚动左侧也跟着变化的效果。
想做这个的时候百度了一下,发现其他解决方案需要第三方。
我不想下第三方浪费时间。
于是老子手写了一个原生的。
于是浪费了更多时间。
。。。。。。。。。。。。。。
浪费时间的原因主要是有坑。(解决坑的方法在本帖最后部分。)
而且加载过多数据的时候(例如几千条几万条子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,相关推荐
- 上海都有哪些牛逼的互联网公司?
作者:墨菲 来源:https://zhuanlan.zhihu.com/p/191577083 上一篇: 成都都有哪些牛逼的互联网公司? 今天来归纳一下上海都有哪些牛逼的互联网公司? 第一梯队:六巨头 ...
- 手机京东菜单html,jQuery仿京东商城手机端商品分类滑动切换特效
jQuery仿京东商城手机端商品分类滑动切换特效 一款仿京商城东手机移动端商品图片分类导航滑动效果,jQuery商品二级分类菜单切换特效. js代码 //设置cookie function setCo ...
- 电脑版和手机版QQ都要手机版QQ扫描二维码登录?
是的,电脑版和手机版 QQ 都需要使用手机版 QQ 扫描二维码登录.这是因为扫描二维码登录是 QQ 的安全认证方式之一.
- Android模仿QQ的左右滑动切换界面和下拉更新的效果
转自http://www.linuxidc.com/Linux/2012-08/67207.htm 主布局main.xml <?xml version="1.0" encod ...
- Android 仿新版QQ的tab下面拖拽标记为已读的效果
可拖拽的红点,(仿新版QQ,tab下面拖拽标记为已读的效果),拖拽一定的距离可以消失回调. GitHub:DraggableFlagView(https://github.com/wangjiegul ...
- Java黑皮书课后题第7章:***7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能相互攻击(没有两个皇后在同行、同列、同一对角线)。编写程序显示一个解决方案
7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能相互攻击(没有两个皇后在同行.同列.同一对角线).编写程序显示一个解决方案 题目 题目描述 破题 题目 题目描述 ...
- android 滑动缩放监听,基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放...
基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放 基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放和透明效果) 在上一个项目的基础上做修改,项目 ...
- 鼠标点击特效:canvas点击效果
JS代码(代码中包含了sketch.min.js的源码,如果你的网站已经引用了,请删掉下面的6到7行.): /** 鼠标点击特效:canvas点击效果*/ /* Copyright (C) 2013 ...
- .验证哥德巴赫猜想,哥德巴赫猜想的内容是:任何一个大于2的偶数都能写成写成两个素数和的形式。 设计一个函数 int isPrime(int n)判断n是否为素数,如果n是素数,函数返回值1,否则返
.验证哥德巴赫猜想,哥德巴赫猜想的内容是:任何一个大于2的偶数都能写成写成两个素数和的形式. 设计一个函数 int isPrime(int n)判断n是否为素数,如果n是素数,函数返回值1,否则返回0 ...
- Javascript特效之动画下拉效果
Javascript特效之动画下拉效果 今天来看看怎么实现好看的动画下拉框效果. 效果图: 点击按钮会呈现动画效果下拉获取缩回. 实现思路: 就是在div里面加一个p元素存放文字.在点击按钮是使用jq ...
最新文章
- Python 3.8即将发布,这几个变化你必须知道
- 职场不需要中年,但中年需要职场
- DDD-EF-数据仓储
- 静态页转换平台(StaticPol)-静态页生成终极解决方案
- 轧机用弹性阻尼体反力计算_三个典型的阻尼模型及相关理论
- list 根据某个数字所在位置_富玩车穷玩表,一个案例轻松认识python列表List——计算Hadamard 乘积...
- 使用C++实现DPCM编码(左向预测8bit、4bit、2bit、1bit和上向预测8bit)(更新过)
- 如果用户的计算机在查询本地Net,网络操作系统管理2448-2
- 《Iterative-GAN》的算法伪代码整理
- 暴力——猜数字(hdu1172)
- tshark查看、指定网卡
- “征信修复”可信吗?企查查显示信用修复相关企业超1.7万家
- 杭电 看归并排序和快速排序
- 【离散数学】集合论 第四章 函数与集合(2) 特殊函数类(单射、满射、双射及其性质、常/恒等函数、置换/排列)
- python内置高级数据结构
- .net反编译工具Reflector下载
- 使用 processon 画 UML 图
- 一部火了20年的音乐剧,到底有何魅力?
- 2022前端面试题上岸手册-浏览器部分
- 企业级BOM系统与外部系统集成的几种方案
热门文章
- 远程桌面连接不能复制粘贴怎么办 远程控制电脑无法复制粘贴的解决方法
- matlab中如何定义局部变量,matlab局部变量定义 persistent
- MADRL(多智能体深度强化学习)
- office2016激活后仍然出现输入激活码
- 来自一个曾经200斤现在140斤程序员的减肥成功经验(包含个人认为相对安全的饮食法推荐)
- oracle 游离块修复,求助讨论---上颌单侧后牙游离缺失的修复
- A股市场,价投者眼中的10大金股,值得收藏(名单)
- SPI 总线3-line、4-line的定义
- 单片机c语言设计奥运五环,如何用C语言程序来设计奥运五环图案.doc
- 外汇EA量化真的可以赚钱吗?还是新型骗局?