日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

發布時間:2025/4/5 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基于Android官方AsyncListUtil優化經典ListView分頁加載機制(二)

我寫的附錄文章1,介紹了如何使用Android官方的分頁加載框架AsyncListUtil優化改進常見的RecyclerView分頁加載實現。AsyncListUtil作為一種通用的分頁加載框架,不僅可以套用在RecyclerView,也可也適用在經典(傳統)ListView中,下面給出一個簡單例子,說明如何通過AsyncListUtil調整ListView的分頁加載機制。
一個簡單的MainActivity適用AsyncListUtil和ListView,展示分頁加載:
package zhangphil.app;import android.app.ListActivity; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.os.SystemClock; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.util.AsyncListUtil; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView;public class MainActivity extends ListActivity {private final String TAG = "調試";private final int NULL = -1;private AsyncListUtil<DataItem> mAsyncListUtil;private MyAdapter mAdapter;private int mFirstVisibleItem = NULL, mVisibleItemCount = NULL;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MyDataCallback mDataCallback = new MyDataCallback();MyViewCallback mViewCallback = new MyViewCallback();mAsyncListUtil = new AsyncListUtil(DataItem.class, 20, mDataCallback, mViewCallback);mAdapter = new MyAdapter(this, NULL);setListAdapter(mAdapter);getListView().setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView absListView, int scrollState) {mAsyncListUtil.onRangeChanged();}@Overridepublic void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {mFirstVisibleItem = firstVisibleItem;mVisibleItemCount = visibleItemCount;}});}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {mAsyncListUtil.refresh();}private class MyDataCallback extends AsyncListUtil.DataCallback<DataItem> {@Overridepublic int refreshData() {//更新數據的個數。//假設預先設定更新若干條。return Integer.MAX_VALUE;}/*** 在這里完成數據加載的耗時任務。** @param data* @param startPosition* @param itemCount*/@Overridepublic void fillData(DataItem[] data, int startPosition, int itemCount) {Log.d(TAG, "fillData:" + startPosition + "," + itemCount);for (int i = 0; i < itemCount; i++) {DataItem dataItem = new DataItem();dataItem.pos = startPosition + i;dataItem.content = String.valueOf(System.currentTimeMillis());data[i] = dataItem;//模擬耗時任務,故意休眠一定時延。SystemClock.sleep(100);}}}private class MyViewCallback extends AsyncListUtil.ViewCallback {/*** @param outRange*/@Overridepublic void getItemRangeInto(int[] outRange) {outRange[0] = mFirstVisibleItem;outRange[1] = mFirstVisibleItem + mVisibleItemCount;/*** 如果當前ListView為空,主動為用戶加載數據.* 假設預先加載若干條數據**/if (outRange[0] == NULL && outRange[1] == NULL) {Log.d(TAG, "當前ListView為空!");outRange[0] = 0;outRange[1] = 9;}Log.d(TAG, "getItemRangeInto,當前可見position: " + outRange[0] + " ~ " + outRange[1]);}@Overridepublic void onDataRefresh() {mAdapter.notifyDataSetChanged();Log.d(TAG, "onDataRefresh");}@Overridepublic void onItemLoaded(int position) {mAdapter.notifyDataSetChanged();Log.d(TAG, "onItemLoaded:" + position);}}private class MyAdapter extends ArrayAdapter {private ViewHolder holder;public MyAdapter(@NonNull Context context, int resource) {super(context, resource);}@NonNull@Overridepublic View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(getApplicationContext()).inflate(android.R.layout.simple_list_item_2, null);holder = new ViewHolder(convertView);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.setData(getItem(position));return convertView;}@Overridepublic int getCount() {return mAsyncListUtil.getItemCount();}@Nullable@Overridepublic DataItem getItem(int position) {return mAsyncListUtil.getItem(position);}}private class ViewHolder {public TextView text1;public TextView text2;public ViewHolder(View view) {text1 = view.findViewById(android.R.id.text1);text1.setTextColor(Color.RED);text2 = view.findViewById(android.R.id.text2);text2.setTextColor(Color.BLUE);}public void setData(DataItem dataItem) {if (dataItem == null) {text1.setText("pos加載中...");text2.setText("content加載中...");} else {text1.setText(String.valueOf(dataItem.pos));text2.setText(dataItem.content);}}}private class DataItem {public int pos;public String content;} }


(一)和RecyclerView一樣,我在ListView中同樣適用ListView的滾動事件觸發AsyncListUtil的onRangeChanged,從而觸發分頁加載機制開始運作。
(二)作為演示,本例在ListView的普通item點擊事件觸發一次AsyncListUtil的refresh事件,這種情況模擬當用戶長期停留在一個頁面需要為用戶主動刷新數據的開發場景。
(三)一點兒特別注意:和附錄文章1在RecyclerView中的AsyncListUtil.DataCallback不同,在RecyclerView中的DataCallback,加載數據fillData方法的第一個參數data數組,如果作為基本數據類型如String,int等等這類,直接data[i]是沒有問題的,data[i]已經被AsyncListUtil創建和初始化完成,但是如果自定義數據類型,比如本例自定義了DataItem,意圖裝載一些開發者自定義的復雜類型,此時直接取出的data[i]為null!所以,為了解決這個問題,要從兩方面入手:
(a)一方面,如果是自定義的數據結構,在fillData中,每一個data[i]為其重新創建new出來一個對象實例,然后賦值給data[i],本例是data[i]=new DataItem()。
(b)另一方面,在最后一關對View進行賦值時候,判斷自定義類型是否為null,不會空指針時候才取出自定義數據結構中的數據元素(本例是DataItem中的成員變量)使用。


附錄:
1,《基于Android官方AsyncListUtil優化改進RecyclerView分頁加載機制(一)》鏈接:http://blog.csdn.net/zhangphil/article/details/78603499?
2,《基于Android官方Paging Library的RecyclerView分頁加載框架》鏈接:http://blog.csdn.net/zhangphil/article/details/78627332?

總結

以上是生活随笔為你收集整理的基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。