Listview滑动时不加载数据,停下来时加载数据,让App更优

数据源配置(Adapter)

package com.zhengsonglan.listview_loading.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.zhengsonglan.listview_loading.R;
import com.zhengsonglan.listview_loading.entity.UserEnity;

import java.util.List;

/**
 *
 */
public class MyAdapter extends BaseAdapter {
    Context context;
    LayoutInflater inflater;
    List<UserEnity> lists;

    private  boolean scrollState=false;

    public void setScrollState(boolean scrollState) {
        this.scrollState = scrollState;
    }

    public MyAdapter(Context context, List<UserEnity> lists) {
        this.context=context;
        this.inflater=LayoutInflater.from(context);
        this.lists=lists;
    }

    @Override
    public int getCount() {
        return lists!=null?lists.size():0;
    }

    @Override
    public Object getItem(int position) {
        return lists.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView=inflater.inflate(R.layout.main_item,null,true);
            viewHolder=new ViewHolder();
            viewHolder.iv_icon= (ImageView) convertView.findViewById(R.id.main_item_iv_icon);
            viewHolder.tv_name= (TextView) convertView.findViewById(R.id.main_item_tv_name);
            convertView.setTag(viewHolder);
        } else {
            viewHolder= (ViewHolder) convertView.getTag();
        }

        UserEnity userEnity=lists.get(position);

        String img_url=userEnity.getIcon();
        if (!scrollState){
            viewHolder.tv_name.setText(userEnity.getName());
            viewHolder.tv_name.setTag(null);
            ImageLoader.getInstance().displayImage(img_url,viewHolder.iv_icon);
            viewHolder.iv_icon.setTag("1");

        }else{
            viewHolder.tv_name.setText("加载中");
            viewHolder.tv_name.setTag(userEnity.getName());
            viewHolder.iv_icon.setTag(img_url);
            viewHolder.iv_icon.setImageResource(R.mipmap.ic_launcher);

        }
        return convertView;

    }

    static class ViewHolder{
        TextView tv_name;
        ImageView iv_icon;
    }
}

这个Adapter中重要的代码如下:

//定义当前listview是否在滑动状态
private  boolean scrollState=false;
public void setScrollState(boolean scrollState) {
    this.scrollState = scrollState;
}
//实体类
UserEnity userEnity=lists.get(position);

if (!scrollState){//如果当前不是滑动的状态,我们填充真数据
            //填充数据
            viewHolder.tv_name.setText(userEnity.getName());
            //设置Tag中数据为空表示数据已填充
            viewHolder.tv_name.setTag(null);
            //加载图片
            ImageLoader.getInstance().displayImage(img_url,viewHolder.iv_icon);
            //设置tag为1表示已加载过数据
            viewHolder.iv_icon.setTag("1");

}else{//如果当前是滑动的状态,我们填充假数据
            viewHolder.tv_name.setText("加载中");
            //将数据name保存在Tag当中
            viewHolder.tv_name.setTag(userEnity.getName());
            //将数据image_url保存在Tag当中
            viewHolder.iv_icon.setTag(img_url);
            //设置默认显示图片(最好是本地资源的图片)
            viewHolder.iv_icon.setImageResource(R.mipmap.ic_launcher);

}

设置监听

ok,我们在看看Activity中的代码,主要是监听listview的onscrolllistener方法

@Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        switch (scrollState){

            case AbsListView.OnScrollListener.SCROLL_STATE_IDLE://停止滚动
            {
                //设置为停止滚动
                myAdapter.setScrollState(false);
                //当前屏幕中listview的子项的个数
                int count = view.getChildCount();
                Log.e("MainActivity",count+"");

                for (int i = 0; i < count; i++) {
                    //获取到item的name
                    TextView tv_name = (TextView) view.getChildAt(i).findViewById(R.id.main_item_tv_name);
                    //获取到item的头像
                    ImageView iv_show= (ImageView) view.getChildAt(i).findViewById(R.id.main_item_iv_icon);

                    if (tv_name.getTag() != null) { //非null说明需要加载数据
                        tv_name.setText(tv_name.getTag().toString());//直接从Tag中取出我们存储的数据name并且赋值
                        tv_name.setTag(null);//设置为已加载过数据
                    }

                    if (!iv_show.getTag().equals("1")){//!="1"说明需要加载数据
                        String image_url=iv_show.getTag().toString();//直接从Tag中取出我们存储的数据image——url
                        ImageLoader.getInstance().displayImage(image_url, iv_show);//显示图片
                        iv_show.setTag("1");//设置为已加载过数据
                    }
                }
                break;
            }
            case AbsListView.OnScrollListener.SCROLL_STATE_FLING://滚动做出了抛的动作
            {
                //设置为正在滚动
                myAdapter.setScrollState(true);
                break;
            }

            case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL://正在滚动
            {
                //设置为正在滚动
                myAdapter.setScrollState(true);
                break;
            }
        }
    }

最后记得给listview加上滑动的监听

listview.setOnScrollListener(this);

效果

时间: 2024-10-12 10:46:22

Listview滑动时不加载数据,停下来时加载数据,让App更优的相关文章

LIstview滑动时不加载图片,停止时加载!

//参照 http://blog.csdn.net/yy1300326388/article/details/45153813 public class CarWashDistanceAdapter extends BaseAdapter { private static final String TAG = "CarWashDistanceAdapter"; private Context context; private MyDialog myDialog; private Arr

Android中ListView滑动时数据混乱

相信做过Android应用开发的或多或少的都遇到过这样的问题,要不就是在ListView滑动时出现数据混乱,或者是GridView滑动时出现数据混乱.先来看看一位网友写的文章,个人感觉这篇文章挺不错的: Android ListView滑动过程中图片显示重复错位闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行i

Android Animation动画实战(一): 从布局动画引入ListView滑动时,每一Item项的显示动画

前言: 之前,我已经写了两篇博文,给大家介绍了Android的基础动画是如何实现的,如果还不清楚的,可以点击查看:Android Animation动画详解(一): 补间动画 及 Android Animation动画详解(二): 组合动画特效 . 已经熟悉了基础动画的实现后,便可以试着去实现常见APP中出现过的那些精美的动画.今天我主要给大家引入一个APP的ListView的动画效果: 当展示ListView时,Listview的每一个列表项都按照规定的动画显示出来. 说起来比较抽象,先给大家

android左右滑动加载分页以及动态加载数据

android UI 往右滑动,滑动到最后一页就自动加载数据并显示 如图: Java代码 package cn.anycall.ju; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.ActivityNotFoundException; impo

ListView下拉刷新,上拉自动加载更多

下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的Android客户端源码.先看示例图.          图1                                                                                                             图2          图3                      

【Win10 应用开发】实现数据的增量加载

今天,老周有小故事讲,国庆期间.有一次老周在某站台上候公交车.老周旁边也站满了人,突然,有一位头发弄得像电线杆的小伙子,不知为何,没有先兆地就大笑起来. 老周先是看了那小伙子一眼,他手上没有拿什么东西(一瓶水),也没在看书或手机,就这样忽然大笑不止.随即,老周便后退了两步,观察一下其他人有什么反应. 一位年轻妈妈拉着小女儿走开了,接着,一位大叔走到垃圾桶旁边拨弄烟灰:然后,一位女孩后退了一两步:站在发笑者旁边的一位先生蹲下身来,不知道在做什么…… 如果是你,你会有什么反应? ==========

react-native ListView 封装 实现 下拉刷新/上拉加载更多

1.PageListView 组件封装 src/components/PageListView/index.js /** * 上拉刷新/下拉加载更多 组件 */ import React, { Component } from 'react'; import { Text, View, ListView, FlatList, Dimensions, PanResponder, Animated, Easing, ActivityIndicator, } from 'react-native';

Plist数据表格的加载详细事例

1.本次主要加载单一字典的plist数据(app.plist),形式如下 2.加载plist数据,先将数据字典转换成对应的模型,本例子所用的是各个应用的图标,对应的就应该创建一个应用图标的模型huapp(名称自拟).在头文件中定义所有变量,以及将字典转换成模型数据的两个方法,如下图: 类方法调用对象方法,在对象方法中转换模型 注意:在对象方法中属性的转化还可已使用KVC,一句代码就解决 [self setValuesForKeysWithDictionary:dict]; 但是使用KVC,就会将

【汇编指令】arm指令集之但寄存器数据load/store (加载存储)

数据的传送: LDR              STR                   .WORD LDRB            STRB              .BYTE LDRH             STRH            .HALFWORD LDR 和STR 加载/存储字和无符号字节指令.使用单一数据传送指令(STR 和LDR)来装载和存储单一字节或字的数据从/到内存.LDR指令用于从内存中读取数据放入寄存器中:STR 指令用于将寄存器中的数据保存到内存.指令格式如下