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
原创粉丝点击