應(yīng)用場景復(fù)現(xiàn)乐纸,文字描述:用戶手動向上滑動屏幕,一直滑動到底端庶喜,繼續(xù)向上滑動救鲤,會出現(xiàn)加載字樣和一個圓圈加載動態(tài)圖標(biāo),加載片刻后本缠,頁面底端增加了展示數(shù)據(jù)斥扛,加載字樣和圓圈消失了
分析:數(shù)據(jù)展示是從上到下一條一條的展示的,有很多條丹锹,向上滑動稀颁,底端會出現(xiàn)很多條新的數(shù)據(jù),所以是列表形式展示數(shù)據(jù)的楣黍,實現(xiàn)列表展示數(shù)據(jù)的控件有很多匾灶,今天我們用最常見和普通的listView控件來實現(xiàn)數(shù)據(jù)的列表展示,首先你會發(fā)現(xiàn)租漂,使用listView展示的列表數(shù)據(jù)最底端沒有出現(xiàn)加載字樣和圓圈秃踩,這太神奇了消别,是不是霉颠?不著急怀读,我們加上不就有了嗎,既然系統(tǒng)自帶的listView控件沒有底端的字樣和圓圈,那我們就不能使用系統(tǒng)默認的listView實現(xiàn)這一功能了,那我們需要自定義一個底端有加載字樣和圓圈的listView了,自定義控件開始了,首先柱宦,新建一個我們自己的listView名字就叫MyListView忧侧,繼承自ListView,默認實現(xiàn)如下的幾個構(gòu)造函數(shù):
public class MyListView extends ListView {
public MyListView(Context context) {
super(context);
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
繼承了ListView熄捍,就有ListView的列表數(shù)據(jù)展示功能苹熏,缺失的是加載字樣和圓圈,我們需要在ListView的基本功能上添加這一功能,首先需要寫好布局,布局如下:
布局代碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
? ? android:layout_width="match_parent"
? ? android:layout_height="match_parent"
? ? android:orientation="horizontal">
<LinearLayout
? ? ? ? android:id="@+id/load_layout"
? ? ? ? android:layout_width="match_parent"
? ? ? ? android:layout_height="match_parent"
? ? ? ? android:gravity="center">
<ProgressBar
? ? ? ? ? ? style="?android:attr/progressBarStyleSmall"
? ? ? ? ? ? android:layout_width="wrap_content"
? ? ? ? ? ? android:layout_height="wrap_content"
? ? ? ? ? ? android:layout_marginRight="20dp" />
<TextView
? ? ? ? ? ? android:layout_width="wrap_content"
? ? ? ? ? ? android:layout_height="wrap_content"
? ? ? ? ? ? android:text="正在加載..."
? ? ? ? ? ? android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
布局實現(xiàn)展示:
布局寫出來了,那么接下來的事便是將布局添加到自定義的ListView中,如何添加,代碼如下:
public class MyListView extends ListView {//implements AbsListView.OnScrollListener
//? ? public ILoadListener iLoadListener;
//? ? public int lastItem, totalItemCount;
//? ? Boolean isLoading=false;
? ? Viewfooter;
? ? public MyListView(Context context) {
super(context);
? ? ? ? initView(context);
? ? }
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
? ? ? ? initView(context);
? ? }
public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
? ? ? ? initView(context);
? ? }
private void initView(Context context) {
footer = LayoutInflater.from(context).inflate(R.layout.layout_footer, null);
//? ? ? ? footer.findViewById(R.id.load_layout).setVisibility(View.GONE);//隱藏底布局
//? ? ? ? //注意塘淑,這句代碼的意思是給自定義的ListView加上底布局
? ? ? ? this.addFooterView(footer);
? ? ? // this.setOnScrollListener(this);
? ? }
}
放在運行的Activity對應(yīng)的布局文件中:
運行看下效果:
效果場景展現(xiàn),文字描述兼吓,滑動到屏幕底端凶朗,出現(xiàn)了加載字樣和圓圈
結(jié)合實際用戶使用的場景宛畦,滑動屏幕底端踏施,應(yīng)該是沒有出現(xiàn)加載字樣和圓圈的,用戶在屏幕底端繼續(xù)向上滑才出現(xiàn)字樣和圓圈,所以默認在底端的時候艳馒,這一布局是隱藏掉的斋日,打開這句代碼贡必,就可以隱藏了:??
? footer.findViewById(R.id.load_layout).setVisibility(View.GONE);//隱藏底布局
下面我們應(yīng)該繼續(xù)實現(xiàn)的是在屏幕最底端科侈,當(dāng)用戶繼續(xù)向上滑動出現(xiàn)的場景权薯,場景是會出現(xiàn)字樣和圓圈刁俭,加載片刻后娩贷,字樣和圓圈消失了甜熔,但是屏幕最底端往上看诵闭,發(fā)現(xiàn)增加了一些新的數(shù)據(jù)展示模狭,那么這一過程如何實現(xiàn),首先我們需要監(jiān)聽用戶滑動屏幕到了最底端晰绎,然后繼續(xù)滑動了构资,代碼如下,實現(xiàn)監(jiān)聽這一功能:
1句携、實現(xiàn)這個接口和接口下的這兩個方法:
實現(xiàn)接口下的兩個方法拨齐,可以實現(xiàn)我們的需求享怀,重寫代碼如下:
關(guān)鍵點在于實現(xiàn)上圖中框住的代碼:
iLoadListener對象是接口對象反番,onLoad()是接口下的方法罢缸,下面是定義接口,和實現(xiàn)接口回調(diào)投队,代碼如下:
1枫疆、定義一個接口:
2、接口的目的是用來回調(diào)實現(xiàn)這句代碼的:
iLoadListener.onLoad();//加載更多數(shù)據(jù)
3敷鸦、接口的實現(xiàn)息楔,在你運行自定義ListView的activity中愿险,實現(xiàn)接口,和接口下的onLoad方法惦费,該方法主要需要實現(xiàn)功能(1)瞧省、加載數(shù)據(jù)(2)构拳、刷新在自定義listview的數(shù)據(jù)展示(3)、隱藏有加載字樣和圓圈的布局footer
4暖混、下面來實現(xiàn)接口的回調(diào),整個過程是:在自定義listview控件MyListView下定義接口ILoadListener和方法onLoad圆存,在使用自定義listview的activity下實現(xiàn)接口ILoadListener和方法onLoad,需要將實現(xiàn)后的接口對象回調(diào)給自定義listview控件MyListView中,那么我們可以在MyListView中設(shè)置一個回調(diào)函數(shù)碌宴,主要接收ILoadListener的接口對象杀狡,設(shè)置為全局變量,實現(xiàn)最終的這句代碼贰镣,iLoadListener.onLoad();//加載更多數(shù)據(jù):
在運行的activity中呜象,
那么,整個接口的申明碑隆,實現(xiàn)恭陡,回調(diào)就完成了,好了思路完畢上煤,onLoad方法里面的代碼就沒貼出來休玩,自己去實現(xiàn),最終運行效果:
默認展現(xiàn)五條數(shù)據(jù)
向上滑動劫狠,出現(xiàn)加載字樣和圓圈:
加載片刻拴疤,加載字樣和圓圈消失,出現(xiàn)新的數(shù)據(jù):
重復(fù)向上滑動操作独泞,又加載了新的四條數(shù)據(jù):
好了 呐矾,效果已實現(xiàn),listview分頁加載實現(xiàn)完畢懦砂!