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

数据源配置(Adapter)

  1. package com.zhengsonglan.listview_loading.adapter;  
  2.   
  3. import android.content.Context;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7. import android.widget.BaseAdapter;  
  8. import android.widget.ImageView;  
  9. import android.widget.TextView;  
  10.   
  11. import com.nostra13.universalimageloader.core.ImageLoader;  
  12. import com.zhengsonglan.listview_loading.R;  
  13. import com.zhengsonglan.listview_loading.entity.UserEnity;  
  14.   
  15. import java.util.List;  
  16.   
  17. /** 
  18.  * 
  19.  */  
  20. public class MyAdapter extends BaseAdapter {  
  21.     Context context;  
  22.     LayoutInflater inflater;  
  23.     List<UserEnity> lists;  
  24.   
  25.     private  boolean scrollState=false;  
  26.   
  27.     public void setScrollState(boolean scrollState) {  
  28.         this.scrollState = scrollState;  
  29.     }  
  30.   
  31.   
  32.     public MyAdapter(Context context, List<UserEnity> lists) {  
  33.         this.context=context;  
  34.         this.inflater=LayoutInflater.from(context);  
  35.         this.lists=lists;  
  36.     }  
  37.   
  38.     @Override  
  39.     public int getCount() {  
  40.         return lists!=null?lists.size():0;  
  41.     }  
  42.   
  43.     @Override  
  44.     public Object getItem(int position) {  
  45.         return lists.get(position);  
  46.     }  
  47.   
  48.     @Override  
  49.     public long getItemId(int position) {  
  50.         return position;  
  51.     }  
  52.   
  53.     @Override  
  54.     public View getView(int position, View convertView, ViewGroup parent) {  
  55.         ViewHolder viewHolder;  
  56.         if (convertView == null) {  
  57.             convertView=inflater.inflate(R.layout.main_item,null,true);  
  58.             viewHolder=new ViewHolder();  
  59.             viewHolder.iv_icon= (ImageView) convertView.findViewById(R.id.main_item_iv_icon);  
  60.             viewHolder.tv_name= (TextView) convertView.findViewById(R.id.main_item_tv_name);  
  61.             convertView.setTag(viewHolder);  
  62.         } else {  
  63.             viewHolder= (ViewHolder) convertView.getTag();  
  64.         }  
  65.   
  66.   
  67.         UserEnity userEnity=lists.get(position);  
  68.   
  69.         String img_url=userEnity.getIcon();  
  70.         if (!scrollState){  
  71.             viewHolder.tv_name.setText(userEnity.getName());  
  72.             viewHolder.tv_name.setTag(null);  
  73.             ImageLoader.getInstance().displayImage(img_url,viewHolder.iv_icon);  
  74.             viewHolder.iv_icon.setTag("1");  
  75.   
  76.         }else{  
  77.             viewHolder.tv_name.setText("加载中");  
  78.             viewHolder.tv_name.setTag(userEnity.getName());  
  79.             viewHolder.iv_icon.setTag(img_url);  
  80.             viewHolder.iv_icon.setImageResource(R.mipmap.ic_launcher);  
  81.   
  82.         }  
  83.         return convertView;  
  84.   
  85.     }  
  86.   
  87.     static class ViewHolder{  
  88.         TextView tv_name;  
  89.         ImageView iv_icon;  
  90.     }  
  91. }  

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

  1. //定义当前listview是否在滑动状态  
  2. private  boolean scrollState=false;  
  3. public void setScrollState(boolean scrollState) {  
  4.     this.scrollState = scrollState;  
  5. }  

  1. //实体类  
  2. UserEnity userEnity=lists.get(position);  
  3.   
  4. if (!scrollState){//如果当前不是滑动的状态,我们填充真数据  
  5.             //填充数据  
  6.             viewHolder.tv_name.setText(userEnity.getName());  
  7.             //设置Tag中数据为空表示数据已填充  
  8.             viewHolder.tv_name.setTag(null);  
  9.             //加载图片  
  10.             ImageLoader.getInstance().displayImage(img_url,viewHolder.iv_icon);  
  11.             //设置tag为1表示已加载过数据  
  12.             viewHolder.iv_icon.setTag("1");  
  13.   
  14. }else{//如果当前是滑动的状态,我们填充假数据  
  15.             viewHolder.tv_name.setText("加载中");  
  16.             //将数据name保存在Tag当中  
  17.             viewHolder.tv_name.setTag(userEnity.getName());  
  18.             //将数据image_url保存在Tag当中  
  19.             viewHolder.iv_icon.setTag(img_url);  
  20.             //设置默认显示图片(最好是本地资源的图片)  
  21.             viewHolder.iv_icon.setImageResource(R.mipmap.ic_launcher);  
  22.   
  23. }  

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

  1. @Override  
  2.     public void onScrollStateChanged(AbsListView view, int scrollState) {  
  3.         switch (scrollState){  
  4.   
  5.             case AbsListView.OnScrollListener.SCROLL_STATE_IDLE://停止滚动  
  6.             {  
  7.                 //设置为停止滚动  
  8.                 myAdapter.setScrollState(false);  
  9.                 //当前屏幕中listview的子项的个数  
  10.                 int count = view.getChildCount();  
  11.                 Log.e("MainActivity",count+"");  
  12.   
  13.                 for (int i = 0; i < count; i++) {  
  14.                     //获取到item的name  
  15.                     TextView tv_name = (TextView) view.getChildAt(i).findViewById(R.id.main_item_tv_name);  
  16.                     //获取到item的头像  
  17.                     ImageView iv_show= (ImageView) view.getChildAt(i).findViewById(R.id.main_item_iv_icon);  
  18.   
  19.                     if (tv_name.getTag() != null) { //非null说明需要加载数据  
  20.                         tv_name.setText(tv_name.getTag().toString());//直接从Tag中取出我们存储的数据name并且赋值  
  21.                         tv_name.setTag(null);//设置为已加载过数据  
  22.                     }  
  23.   
  24.                     if (!iv_show.getTag().equals("1")){//!="1"说明需要加载数据  
  25.                         String image_url=iv_show.getTag().toString();//直接从Tag中取出我们存储的数据image——url  
  26.                         ImageLoader.getInstance().displayImage(image_url, iv_show);//显示图片  
  27.                         iv_show.setTag("1");//设置为已加载过数据  
  28.                     }  
  29.                 }  
  30.                 break;  
  31.             }  
  32.             case AbsListView.OnScrollListener.SCROLL_STATE_FLING://滚动做出了抛的动作  
  33.             {  
  34.                 //设置为正在滚动  
  35.                 myAdapter.setScrollState(true);  
  36.                 break;  
  37.             }  
  38.   
  39.             case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL://正在滚动  
  40.             {  
  41.                 //设置为正在滚动  
  42.                 myAdapter.setScrollState(true);  
  43.                 break;  
  44.             }  
  45.         }  
  46.     }  

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

listview.setOnScrollListener(this);

效果

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值