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

简介:

转载:http://blog.csdn.net/yy1300326388/article/details/45153813

数据源配置(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);

}

我们在看看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);

效果

这里写图片描述


相关文章
|
16天前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
66 0
安卓项目:app注册/登录界面设计
|
1月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
74 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
14天前
|
JSON API 网络安全
App数据的爬取
App数据的爬取
28 3
|
1月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
|
1月前
|
XML Android开发 数据格式
🌐Android国际化与本地化全攻略!让你的App走遍全球无障碍!🌍
在全球化背景下,实现Android应用的国际化与本地化至关重要。本文以一款旅游指南App为例,详细介绍如何通过资源文件拆分与命名、适配布局与方向、处理日期时间及货币格式、考虑文化习俗等步骤,完成多语言支持和本地化调整。通过邀请用户测试并收集反馈,确保应用能无缝融入不同市场,提升用户体验与满意度。
62 3
|
15天前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
73 0
|
1月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
60 10
|
1月前
|
XML 数据库 Android开发
10分钟手把手教你用Android手撸一个简易的个人记账App
该文章提供了使用Android Studio从零开始创建一个简单的个人记账应用的详细步骤,包括项目搭建、界面设计、数据库处理及各功能模块的实现方法。
|
2月前
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
57 1
|
2月前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据