Android优化:ListView嵌套GridView滑动时不加载图片,停止后加载图片
来源:互联网 发布:新浪博客做淘宝客网站 编辑:程序博客网 时间:2024/05/15 00:04
前一阵接手的项目,有一个ListView嵌套GridView的页面,GridView的item很简单,只是一张图片,但是在滑动的时候很不流畅,造成了我的经理时不时来找我聊一聊。其实从一开始接手这个项目的时候我就很不爽,上一个开发人员留下了一屁眼子的bug来等着我修复,来了公司3个月了, 添加的功能没有多少,基本一直在改bug! 但是之前听到过一句话:“bug是程序员成长的阶梯”,想一想,也就没有那么不爽了。 好了,开始我的表演了。基本布局就是ListView嵌套GridView。
<ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="10dp" android:divider="#cccccc" android:dividerHeight="1dp"/>
ListView的item的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/item_life_fragment_tv" android:layout_width="match_parent" android:layout_height="40dp" android:background="#efefef" android:paddingBottom="10dp" android:paddingLeft="10dp" android:paddingTop="10dp" android:text="hahaha" android:textColor="#1b1b1b" android:textSize="14dp" /> <CustomGridView android:id="@+id/dragGridView" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:horizontalSpacing="0.5dp" android:numColumns="4" android:stretchMode="columnWidth" android:verticalSpacing="0.5dp"/></LinearLayout>
其中CustomGridView是重写过的GridView
public class CustomGridView extends GridView { public CustomGridView(Context context) { super(context); } public CustomGridView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomGridView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub /** * 使用expandSpec代替heightMeasureSpec。很容易理解,就是我们改变了的GridView的高度获取方式。 * * int size:表示父布局提供给你的大小参考 * int mode:表示规格,有EXACTLY、AT_MOST、UNSPECIFIED三种。 * 代码中填的两个值的作用 * Integer.MAX_VALUE >> 2:表示父布局给的参考的大小无限大。(listview无边界) * MeasureSpec.AT_MOST:表示根据布局的大小来确定listview最终的高度,也就是有多少内容就显示多高。 */ int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }}
具体的设置数据我就不详细的贴出来了,大家应该都知道改如何填充数据,下面我要说的就是如何要在ListView滑动的时候不加载图片,等到停止的时候在加载图片。
1、在Activity中监听ListView的OnScrollListenre(),在onScrollStateChanged方法中监听滑动的状态,并且将状态值传递到设备器中,监听到滑动停止的状态时要找到设置图片的控件,为它设置图片。
listView.setOnScrollListener(this);@Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { case SCROLL_STATE_IDLE://滚动停止时的状态 //设置为停止滚动 listViewAdapter.setScrollState(false); //当前屏幕中listview的子项的个数 int count = view.getChildCount(); //循环每一个listview的item的数量 for (int i = 0; i < count; i++) { //获取每个item中的GridView GridView gridView = (GridView) view.getChildAt(i).findViewById(R.id.customGridView); //获取当前GridView的item的的个数 int gridCount = gridView.getChildCount(); //循环获取到GridView的item的显示图片的控件并设置图片 for (int j = 0; j < gridCount; j++) { //获取到GridView中item的图片显示的Imageview控件 ImageView iv_show = (ImageView) gridView.getChildAt(j).findViewById(R.id.item_img); if (!iv_show.getTag().equals("1")) {//如果等于1说明图片资源已加载过,不等于说明没有去getTag()的图片url //直接从Tag中取出我们存储的数据image——url String image_url = iv_show.getTag().toString(); if (image_url != null) {//这个判断是防止图片的url是否为空,为空的话给默认图片。 //通过image_url地址为iv_show设置图片 Glide.with(this).load(image_url).into(iv_show); //设置为已加载过数据 iv_show.setTag("1"); } else { iv_show.setBackgroundResource(R.drawable.loading1); iv_show.setTag("1"); } } } } break; case SCROLL_STATE_TOUCH_SCROLL://触摸正在滚动,手指还没离开界面时的状态 //设置为正在滚动 listViewAdapter.setScrollState(true); break; case SCROLL_STATE_FLING://用户在用力滑动后,ListView由于惯性将继续滑动时的状态 //设置为正在滚动 listViewAdapter.setScrollState(true); break; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { }
2、在CustomGridView的适配器中填入以下逻辑
String img_url = list.get(position).getImg(); if(!scrollState) { //如果当前不是滑动的状态,我们填充真数据 //这是我加载图片的方法 Glide.with(context).load(image_url).into(iv_show); viewHolder.imageView.setTag("1"); }else{ //如果当前是滑动的状态,我们填充假数据 //将数据image_url保存在Tag当中 viewHolder.imageView.setTag(img_url); //设置默认显示图片(最好是本地资源的图片) viewHolder.imageView.setImageResource(R.drawable.loading1); }
基本上 这就ok了 。
阅读全文
0 0
- Android优化:ListView嵌套GridView滑动时不加载图片,停止后加载图片
- android listview 滑动过程中不加载图片,停止时加载图片
- Android listview 滑动过程中不加载图片,停止时加载图片
- android listview滑动过程中不加载图片,停止时加载图片。
- 简单实现 Android listview 滑动过程中不加载图片,停止时加载图片
- listview优化:滑动时不加载图片
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- Android Listview 加载图片优化--本地加载大量图片,解决滑动卡顿现象(滑动停止加载图片)
- Android Listview 加载图片优化--本地加载大量图片,解决滑动卡顿现象(滑动停止加载图片)
- ListView、GridView滑动时禁止加载图片
- listview滑动不加载图片
- ListView滑动时不加载图片
- ListView快速滑动时不加载图片
- Android之 ListView滑动时不加载图片
- listview 滑动的时候不加载图片,,,停止的时候加载图片
- LeetCode简易题解--039
- 滑稽色图片小爬虫
- 姗姗来迟的中文Webfont
- Centos6.9安装和IP配置
- CSDN博客开端---杂谈
- Android优化:ListView嵌套GridView滑动时不加载图片,停止后加载图片
- Ambiguous use of 'subscript'
- E
- 分类算法中常用的评价指标
- 1011.A+B和C(15)
- Alluxio简介 & 在Alluxio上运行Spark与MapReduce
- ACM的准备之路(蓝桥杯1)
- JavaWeb前端到后台常用框架介绍
- 对不起,双十一,我已经没手可剁了!