• 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. }  
     
     
  • 相关阅读:
    Idea创建Hibernate bean类和.xml文件
    Hibernate 一对多,多对多,多对一检索策略
    Hibernate 性能优化一对一关联映射
    HashSet 与TreeSet和LinkedHashSet的区别
    使用LinkedList模拟一个堆栈或者队列数据结构
    设计模式------工厂模式和抽象工厂模式
    悟透JavaScript
    JS产生随机数的几个用法!
    防盗链
    nigin配置安全:三个案例看Nginx配置安全(转)
  • 原文地址:https://www.cnblogs.com/sishahu/p/5366636.html
Copyright © 2020-2023  润新知