ListView动态加载数据
2014-11-27 17:32
344 查看
原文地址: http://hddev.blog.51cto.com/3365350/651517
当listview需要加载的数据过多时,若一次性载入则速度会相当缓慢,影响用户体验,这时候就需要动态加载数据,即每次载入固定长度的数据,android market的listview就是采用这种方式,使得加载看起来很平滑,响应速度很快,有助于提高用户体验。
首先,要实现动态加载首先需要在获取数据时每次在上次获取到的数据之后的位置开始取得固定长度的数据,可通过"select * from TableName LIMIT m OFFSET n"语句实现,其中m是要取得数据的长度,n是数据的偏移量。
然后,在Activity中需要重写listview的onScroll方法,在onScroll中添加判断条件,当上一次加载的数据显示完并滑动到底部之后需要再次获取数据,可以在UI Thread中在开启一个线程去加载数据,加载数据时应弹出一个试图提示用户正在加载。
最后,加载数据的线程处理完毕后,刷新ListView。
以下是实现动态加载的主要步骤:
当listview需要加载的数据过多时,若一次性载入则速度会相当缓慢,影响用户体验,这时候就需要动态加载数据,即每次载入固定长度的数据,android market的listview就是采用这种方式,使得加载看起来很平滑,响应速度很快,有助于提高用户体验。
首先,要实现动态加载首先需要在获取数据时每次在上次获取到的数据之后的位置开始取得固定长度的数据,可通过"select * from TableName LIMIT m OFFSET n"语句实现,其中m是要取得数据的长度,n是数据的偏移量。
然后,在Activity中需要重写listview的onScroll方法,在onScroll中添加判断条件,当上一次加载的数据显示完并滑动到底部之后需要再次获取数据,可以在UI Thread中在开启一个线程去加载数据,加载数据时应弹出一个试图提示用户正在加载。
最后,加载数据的线程处理完毕后,刷新ListView。
以下是实现动态加载的主要步骤:
//加载数据的方法 private void fillAdapter(int count, int begin) { // TODO Auto-generated method stub SQLiteOpenHelper mSQLiteOpenHelper = new SQLiteOpenHelper ( this); Cursor c= mSQLiteOpenHelper .getDynamicListViewData(count, offset); }
//监听listview的onScroll方法 OnScrollListener listScroll = new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(isLoading) //正在加载时就不要让在执行活动触发事件 return; if (firstVisibleItem + visibleItemCount == totalItemCount) { // 开线程去获取数据 if (totalItemCount <= totalItemsCount) { Integer[] params = new Integer[] { 25, currentItemCount }; mAsynchTask = new AsynchTask(); mAsynchTask.execute(params); } else { Toast.makeText(EventTracker.this, "there is no data!", Toast.LENGTH_SHORT).show(); } } } };
//通过AsyncTask更方便的实现多线程管理,使得加载效果更平滑 private class AsynchTask extends AsyncTask<Integer, Void, Void> { @Override /**将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。 * 这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法 * 来更新实时的任务进度。该方法是抽象方法,子类必须实现。 */ protected Void doInBackground(Integer... params) { fillAdapter(params[0], params[1]); return null; } @Override /** 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用, * 后台的计算结果将通过该方法传递到UI thread. * */ protected void onPreExecute() { //loadingView为自定义的一个dialog,用于提示用户正在加载 mEventListView.addFooterView(loadingView); isLoading=true; } @Override /** 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用, * 后台的计算结果将通过该方法传递到UI thread. * */ protected void onPostExecute(Void result) { bindAdapter(); mListView.removeFooterView(loadingView); mListView.setSelection(currentItemCount); currentItemCount += 25;//每次加载25列,偏移量也递增25 isLoading=false; } }
数据库中方法如下: public Cursor getDynamicListViewData(int count, int offset) { return getReadableDatabase().rawQuery( "select * from TableName limit " + count + "offset" + offset, null); }
相关文章推荐
- Listview动态加载数据
- Listview动态加载数据
- ListView动态加载图片以及分段加载数据
- Android中ListView动态加载数据 加载中 .
- ListView动态加载数据模板(使用代码布局)
- ListView动态加载数据 推荐
- Listview动态加载数据
- Android的ListView动态加载数据
- 【Android动态布局】之【ListView动态加载数据】
- Listview动态加载数据
- LISTVIEW动态加载网络数据2
- Android中使用Listview动态加载数据
- LISTVIEW动态加载网络数据2
- Android中ListView动态加载数据
- Android中ListView动态加载数据
- Listview动态加载网络数据
- 动态加载listView中的数据
- listView 下拉动态加载数据
- listview动态加载数据,并更新数据列表