Android ListView實現(xiàn)上拉加載更多和下拉刷新功能
本文實例為大家介紹了Android ListView下拉刷新功能的實現(xiàn)方法和功能,供大家參考,具體內(nèi)容如下
1、ListView優(yōu)化方式
界面緩存:ViewHolder+convertView
分頁加載:上拉刷新
圖片緩存
快速滑動ListView禁止刷新
2、效果

3、上拉加載更多原理及實現(xiàn)
當我們手指滑動到listview最后位置的時候,我們觸發(fā)加載數(shù)據(jù)的方法。這觸發(fā)之前我們需要做一些工作,包括:
如何判斷滑動到最后?
如何避免重復加載數(shù)據(jù)?
加載之后如何刷新界面?
1)、界面實現(xiàn)AbsListView.OnScrollListener接口,當firstVisibleItem + visibleItemCount >= totalItemCount即可判斷滑動到了最下面;
2)、為了不重復加載數(shù)據(jù),例如當我手指滑動到最下面,手指立馬離開,然后再馬上滑動,就會導致數(shù)據(jù)拉取兩次,我們利用mHandler.hasMessages(LOAD)判斷消息隊列中是否已經(jīng)存在這個消息;
3)、我們在handler中加載新數(shù)據(jù),并且利用 mStringArrayAdapter.notifyDataSetChanged();通知界面刷新。
int result1;
int result2;
//監(jiān)聽狀態(tài)改變
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
//滑動結(jié)束
break;
case SCROLL_STATE_FLING:
//手指離開屏幕
if (result1 >= result2) {
//只發(fā)送一次,防止多次加載數(shù)據(jù)
if (!mHandler.hasMessages(LOAD))
mHandler.sendEmptyMessageDelayed(LOAD, 5000);
}
break;
case SCROLL_STATE_TOUCH_SCROLL:
//滑動中
break;
}
}
//滑動結(jié)束之后執(zhí)行
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// Log.e(TAG, "firstVisibleItem:" + firstVisibleItem + "---visibleItemCount:" + visibleItemCount + "--totalItemCount:" + totalItemCount);
//加載到最后
if (firstVisibleItem + visibleItemCount >= totalItemCount) {
//這里不處理,在上面狀態(tài)改變結(jié)束之后再處理
}
}
4、下拉加刷新原理及實現(xiàn)
下拉刷新核心原理和上拉加載核心原理一致,只是有細節(jié)不同。我們需要處理以下問題:如何判斷用戶當前位置在數(shù)據(jù)第一條?如何判斷用戶在第一條的同時下拉一定距離?如何刷新更新界面(上面已經(jīng)解決)?
1)、注意事項:
初始化應(yīng)該設(shè)置默認上面的刷新圖標隱藏,在ProgressBar中設(shè)置Android:visibility="gone";這樣設(shè)置還不行,還需要設(shè)置 mListView.setSelection(1);讓當前第一列是第一條數(shù)據(jù)。同樣的,在加載完成之后也要設(shè)置mListView.setSelection(1);,顯示第一行。
2)、實現(xiàn)
*判斷第一條的方式mListView.getFirstVisiblePosition()==0
*mListView實現(xiàn) mListView.setOnTouchListener方法,來根據(jù)用戶手指按下的位置以及抬起的位置,計算這兩者的距離與我們規(guī)定的距離(如100)的大小,如大于就進行刷新操作。
*刷新之后通知界面mStringArrayAdapter.notifyDataSetChanged();
mListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startY=event.getY();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
endY=event.getY();
if(endY-startY> DISTANT&&(mListView.getFirstVisiblePosition()==1||mListView.getFirstVisiblePosition()==0)){
if(!mHandler.hasMessages(FRESH)){
mProgressBar_top.setVisibility(View.VISIBLE);
//notif
mHandler.sendEmptyMessageDelayed(FRESH,5000);
}
}
break;
}
//不能返回true,不然直接消費掉了
return false;
}
});
以上就是本文的全部內(nèi)容,希望對大家學習Android軟件編程有所幫助。
- Android下拉刷新ListView——RTPullListView(demo)
- Android中使用RecyclerView實現(xiàn)下拉刷新和上拉加載
- Android下拉刷新上拉加載控件(適用于所有View)
- Android RecyclerView實現(xiàn)下拉刷新和上拉加載
- android開發(fā)教程之實現(xiàn)listview下拉刷新和上拉刷新效果
- Android實現(xiàn)上拉加載更多以及下拉刷新功能(ListView)
- Android RecyclerView 上拉加載更多及下拉刷新功能的實現(xiàn)方法
- android下拉刷新ListView的介紹和實現(xiàn)代碼
- Android使用recyclerview打造真正的下拉刷新上拉加載效果
- Android自定義View仿騰訊TIM下拉刷新View
相關(guān)文章
配置android開發(fā)環(huán)境時出現(xiàn)eclipse獲取不到ADT的解決方法
這篇文章主要介紹了配置android開發(fā)環(huán)境時出現(xiàn)eclipse獲取不到ADT的解決方法,涉及針對開發(fā)環(huán)境hosts文件域名映射的修改及eclipse配置的修改技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-12-12
JetPack Compose底部導航欄的實現(xiàn)方法詳解
開發(fā)一個新項目,底部導航欄一般是首頁的標配,在以前的xml布局中,我們可以很輕松的是用谷歌提供的BottomNavigationView或者自定義來實現(xiàn)底部導航的功能,在Compose中也有也提供了一個類似的控件androidx.compose.material.BottomNavigation2022-09-09
Android簡單創(chuàng)建一個Activity的方法

