ListView动态加载数据模板
创始人
2024-07-30 14:20:59
0

对于做Android应用程序来说,ListView一定用得非常多,经常解析xml文件然后在ListView中显示,往往我们需要让它动态地加载内容,也就是不一次性地加载完成,对于手机来说,这点很重要!笔者之前也是弄的不明白,用的时候直接在网上找代码,复制粘贴,再修改一下就是自己的了,笔者的这个小Demo灵感来自于新浪或者腾讯微博手机客户端,比如***页加载十条Item,当翻到***一个Item的时候,会出来一个Button,当点击Button的时候就会继续加载更多的,当然如果不点,就不会加载的,节约用户流量,先看效果图

 

 

如果觉得满意的话就继续看下面的代码吧,笔者这里没有用到main.xml文件,全部在java文件中定义的,如果理解了的话自己可以在xml文件里面写布局

  1. package com.focus.loading;  
  2. import android.app.ListActivity;  
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.view.Gravity;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.view.ViewGroup;  
  9. import android.view.ViewGroup.LayoutParams;  
  10. import android.widget.AbsListView;  
  11. import android.widget.AbsListView.OnScrollListener;  
  12. import android.widget.BaseAdapter;  
  13. import android.widget.Button;  
  14. import android.widget.LinearLayout;  
  15. import android.widget.ListView;  
  16. import android.widget.ProgressBar;  
  17. import android.widget.TextView;  
  18. public class ListViewActivity extends ListActivity implements OnScrollListener {  
  19.     private LinearLayout mLoadLayout;  
  20.     private LinearLayout mProgressLoadLayout;  
  21.     private ListView mListView;  
  22.     private ListViewAdapter mListViewAdapter = new ListViewAdapter();  
  23.     private int mLastItem = 0;  
  24.     private int mCount = 41;  
  25.     private final Handler mHandler = new Handler();// 在Handler中加载数据  
  26.     private final LayoutParams mLayoutParams = new LinearLayout.LayoutParams(  
  27.             LinearLayout.LayoutParams.WRAP_CONTENT,  
  28. LinearLayout.LayoutParams.WRAP_CONTENT);  
  29.     int scrollState;// 全局变量,用来记录ScrollView的滚动状态,1表示开始滚动,2表示正在滚动,0表示滚动停止  
  30.     int visibleItemCount;// 当前可见页面中的Item总数  
  31.     @Override  
  32.     public void onCreate(Bundle savedInstanceState) {  
  33.         super.onCreate(savedInstanceState);  
  34.         /**  
  35.          * "加载项"布局,此布局被添加到ListView的Footer中。  
  36.          */  
  37.         mLoadLayout = new LinearLayout(this);  
  38.         mLoadLayout.setMinimumHeight(30);  
  39.         mLoadLayout.setGravity(Gravity.CENTER);  
  40.         mLoadLayout.setOrientation(LinearLayout.VERTICAL);  
  41.         /*  
  42.          * 当点击按钮的时候显示这个View,此View使用水平方式布局,左边是一个进度条,右边是文本,默认设为不可见  
  43.          */  
  44.         mProgressLoadLayout = new LinearLayout(this);  
  45.         mProgressLoadLayout.setMinimumHeight(30);  
  46.         mProgressLoadLayout.setGravity(Gravity.CENTER);  
  47.         mProgressLoadLayout.setOrientation(LinearLayout.HORIZONTAL);  
  48.  
  49.         ProgressBar mProgressBar = new ProgressBar(this);  
  50.         mProgressBar.setPadding(0, 0, 15, 0);  
  51.         mProgressLoadLayout.addView(mProgressBar, mLayoutParams);// 为布局添加进度条  
  52.  
  53.         TextView mTipContent = new TextView(this);  
  54.         mTipContent.setText("加载中...");  
  55.         mProgressLoadLayout.addView(mTipContent, mLayoutParams);// 为布局添加文本  
  56.         mProgressLoadLayout.setVisibility(View.GONE);// 默认设为不可见,注意View.GONE和View.INVISIBLE的区别  
  57.  
  58.         mLoadLayout.addView(mProgressLoadLayout);// 把之前的布局以View对象添加进来  
  59.         final Button button = new Button(this);  
  60.         button.setText("加载更多");  
  61.         // 添加按钮  
  62.         mLoadLayout.addView(button, new LayoutParams(LayoutParams.FILL_PARENT,  
  63.                 LayoutParams.WRAP_CONTENT));  
  64.         button.setOnClickListener(new OnClickListener() {  
  65.             @Override  
  66.             public void onClick(View v) {  
  67.                 if (mLastItem == mListViewAdapter.count  
  68.                         && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {  
  69.                     // 当点击时把带进度条的Layout设为可见,把Button设为不可见  
  70.                     mProgressLoadLayout.setVisibility(View.VISIBLE);  
  71.                     button.setVisibility(View.GONE);  
  72.                     if (mListViewAdapter.count <= mCount) {  
  73.                         mHandler.postDelayed(new Runnable() {  
  74.                             @Override  
  75.                             public void run() {  
  76.                                 mListViewAdapter.count += 10;  
  77.                                 mListViewAdapter.notifyDataSetChanged();  
  78.                                 mListView.setSelection(mLastItem  
  79.                                         - visibleItemCount + 1);  
  80.                                 // 获取数据成功时把Layout设为不可见,把Button设为可见  
  81.                                 mProgressLoadLayout.setVisibility(View.GONE);  
  82.                                 button.setVisibility(View.VISIBLE);  
  83.                             }  
  84.                         }, 2000);  
  85.                     }  
  86.                 }  
  87.             }  
  88.         });  
  89.  
  90.         mListView = getListView();  
  91.         mListView.addFooterView(mLoadLayout);  
  92.         setListAdapter(mListViewAdapter);  
  93.         mListView.setOnScrollListener(this);  
  94.     }  
  95.     @Override  
  96.     public void onScroll(AbsListView view, int firstVisibleItem,  
  97.             int visibleItemCount, int totalItemCount) {  
  98.         this.visibleItemCount = visibleItemCount;  
  99.         mLastItem = firstVisibleItem + visibleItemCount - 1;  
  100.         if (mListViewAdapter.count > mCount) {  
  101.             mListView.removeFooterView(mLoadLayout);  
  102.         }  
  103.     }  
  104.     @Override  
  105.     public void onScrollStateChanged(AbsListView view, int scrollState) {  
  106.         this.scrollState = scrollState;  
  107.  
  108.     }  
  109.     class ListViewAdapter extends BaseAdapter {  
  110.         int count = 10;  
  111.  
  112.         public int getCount() {  
  113.             return count;  
  114.         }  
  115.         public Object getItem(int position) {  
  116.             return position;  
  117.         }  
  118.  
  119.         public long getItemId(int position) {  
  120.             return position;  
  121.         }  
  122.         public View getView(int position, View view, ViewGroup parent) {  
  123.             TextView mTextView;  
  124.             if (view == null) {  
  125.                 mTextView = new TextView(ListViewActivity.this);  
  126.             } else {  
  127.                 mTextView = (TextView) view;  
  128.             }  
  129.             mTextView.setText("Item " + position);  
  130.             mTextView.setTextSize(20f);  
  131.             mTextView.setGravity(Gravity.CENTER);  
  132.             mTextView.setHeight(60);  
  133.             return mTextView;  
  134.         }  
  135.     }  

【编辑推荐】

Android ListView详解

使用ListView 显示数据

Android开发:自定义GridView/ListView数据源

Android开发:实现带图片和checkbox的listview

Android开发:实现带图片和checkbox的listview

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...