zoukankan      html  css  js  c++  java
  • Android中ListView动态加载数据

    1. 引言:

    为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并渲染到ListView组件中,这样可以极大的改善应用程序的性能和用户体验。

    2. 交互:

    进入ListView组件,首先预加载N条记录,当用户滑动到最后一条记录显示加载提示信息,并从后台加载N条数据,接着渲染UI界面。

    3. 效果图:

    ListView动态加载数据 

    4. 程序实现:

    [java] view plain copy
     
    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.ViewGroup;  
    8. import android.widget.AbsListView;  
    9. import android.widget.BaseAdapter;  
    10. import android.widget.LinearLayout;  
    11. import android.widget.ListView;  
    12. import android.widget.ProgressBar;  
    13. import android.widget.TextView;  
    14. import android.widget.AbsListView.OnScrollListener;  
    15. import android.widget.LinearLayout.LayoutParams;  
    16. public class ListViewLoadingActivity extends ListActivity implements  
    17.         OnScrollListener {  
    18.     @Override  
    19.     public void onCreate(Bundle savedInstanceState) {  
    20.         super.onCreate(savedInstanceState);  
    21.         /** 
    22.          * "加载项"布局,此布局被添加到ListView的Footer中。 
    23.          */  
    24.         mLoadLayout = new LinearLayout(this);  
    25.         mLoadLayout.setMinimumHeight(60);  
    26.         mLoadLayout.setGravity(Gravity.CENTER);  
    27.         mLoadLayout.setOrientation(LinearLayout.HORIZONTAL);  
    28.         /** 
    29.          * 向"加载项"布局中添加一个圆型进度条。 
    30.          */  
    31.         ProgressBar mProgressBar = new ProgressBar(this);  
    32.         mProgressBar.setPadding(0, 0, 15, 0);  
    33.         mLoadLayout.addView(mProgressBar, mProgressBarLayoutParams);  
    34.         /** 
    35.          * 向"加载项"布局中添加提示信息。 
    36.          */  
    37.         TextView mTipContent = new TextView(this);  
    38.         mTipContent.setText("加载中...");  
    39.         mLoadLayout.addView(mTipContent, mTipContentLayoutParams);  
    40.         /** 
    41.          * 获取ListView组件,并将"加载项"布局添加到ListView组件的Footer中。 
    42.          */  
    43.         mListView = getListView();  
    44.         mListView.addFooterView(mLoadLayout);  
    45.         /** 
    46.          * 组ListView组件设置Adapter,并设置滑动监听事件。 
    47.          */  
    48.         setListAdapter(mListViewAdapter);  
    49.         mListView.setOnScrollListener(this);  
    50.     }  
    51.     public void onScroll(AbsListView view, int mFirstVisibleItem,  
    52.             int mVisibleItemCount, int mTotalItemCount) {  
    53.         mLastItem = mFirstVisibleItem + mVisibleItemCount - 1;  
    54.         if (mListViewAdapter.count > mCount) {  
    55.             mListView.removeFooterView(mLoadLayout);  
    56.         }  
    57.     }  
    58.     public void onScrollStateChanged(AbsListView view, int mScrollState) {  
    59.           
    60.         /** 
    61.          * 当ListView滑动到最后一条记录时这时,我们会看到已经被添加到ListView的"加载项"布局, 这时应该加载剩余数据。 
    62.          */  
    63.         if (mLastItem == mListViewAdapter.count  
    64.                 && mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {  
    65.             if (mListViewAdapter.count <= mCount) {  
    66.                 mHandler.postDelayed(new Runnable() {  
    67.                     @Override  
    68.                     public void run() {  
    69.                         mListViewAdapter.count += 10;  
    70.                         mListViewAdapter.notifyDataSetChanged();  
    71.                         mListView.setSelection(mLastItem);  
    72.                     }  
    73.                 }, 1000);  
    74.             }  
    75.         }  
    76.     }  
    77.     class ListViewAdapter extends BaseAdapter {  
    78.         int count = 10;  
    79.         public int getCount() {  
    80.             return count;  
    81.         }  
    82.         public Object getItem(int position) {  
    83.             return position;  
    84.         }  
    85.         public long getItemId(int position) {  
    86.             return position;  
    87.         }  
    88.         public View getView(int position, View view, ViewGroup parent) {  
    89.             TextView mTextView;  
    90.             if (view == null) {  
    91.                 mTextView = new TextView(ListViewLoadingActivity.this);  
    92.             } else {  
    93.                 mTextView = (TextView) view;  
    94.             }  
    95.             mTextView.setText("Item " + position);  
    96.             mTextView.setTextSize(20f);  
    97.             mTextView.setGravity(Gravity.CENTER);  
    98.             mTextView.setHeight(60);  
    99.             return mTextView;  
    100.         }  
    101.     }  
    102.     private LinearLayout mLoadLayout;  
    103.     private ListView mListView;  
    104.     private ListViewAdapter mListViewAdapter = new ListViewAdapter();  
    105.     private int mLastItem = 0;  
    106.     private int mCount = 41;  
    107.     private final Handler mHandler = new Handler();  
    108.     private final LayoutParams mProgressBarLayoutParams = new LinearLayout.LayoutParams(  
    109.             LinearLayout.LayoutParams.WRAP_CONTENT,  
    110.             LinearLayout.LayoutParams.WRAP_CONTENT);  
    111.     private final LayoutParams mTipContentLayoutParams = new LinearLayout.LayoutParams(  
    112.             LinearLayout.LayoutParams.WRAP_CONTENT,  
    113.             LinearLayout.LayoutParams.WRAP_CONTENT);  
    114. }  
     
     
  • 相关阅读:
    javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码
    windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况
    javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url
    ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
    HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码
    Servlet主要相关类核心类 容器调用的过程浅析 servlet解读 怎么调用 Servlet是什么 工作机制
    linq查询语句转mongodb
    winddows rabbitmq安装与配置
    Redis For Windows安装及密码
    出现,视图必须派生自 WebViewPage 或 WebViewPage错误解决方法
  • 原文地址:https://www.cnblogs.com/sishahu/p/5366636.html
Copyright © 2011-2022 走看看