Android自定義下拉刷新上拉加載
本文實(shí)例為大家分享了Android自定義下拉刷新上拉加載的具體實(shí)現(xiàn)步驟,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)的方式是SwipeRefreshLayout + RecyclerView 的VIewType
首先看效果:

總的思路:

布局文件
<android.support.v4.widget.SwipeRefreshLayout
android:layout_marginTop="?attr/actionBarSize"
android:id="@+id/one_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/one_recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
下拉刷新的實(shí)現(xiàn)思路

用于測試的Model
public class TestModel {
private String mTitle;
private String mDesc;
private String mTime;
public TestModel(String mTitle, String mDesc, String mTime) {
this.mTitle = mTitle;
this.mDesc = mDesc;
this.mTime = mTime;
}
//...一堆getXxx ,setXxx方法
//equals必寫,添加數(shù)據(jù)時(shí)候用于判斷
@Override
public boolean equals(Object o) {
TestModel model = (TestModel) o;
if (!mTitle.equals(model.getmTitle())) {
return false;
} else if (!mDesc.equals(model.getmDesc())) {
return false;
} else if (!mTime.equals(model.getmTitle())) {
return false;
}
return true;
}
模擬獲取網(wǎng)絡(luò)數(shù)據(jù)的代碼
private class GetData {
int size = 0 ;
int max = 25; //數(shù)據(jù)的最大值
public void setStart(int size) {
this.size = size;
}
//根據(jù)size獲取指定大小的List,最大不能超過max
public List<TestModel> initData(int size) {
List<TestModel> mDatas = new ArrayList<>();
TestModel model = null;
for (int i = start; i < ((size + start) > max ? max : (size + start)); i++) {
model = new TestModel("Title" + i, "Desc" + i, "今天 11:30");
mDatas.add(model);
}
start += size;
return mDatas;
}
}
數(shù)據(jù)獲取并通知初始化RecyclerView
public void initData() {
if (getData == null) {
getData = new GetData();
}
mLists = getData.initData(size); //獲取默認(rèn)顯示的數(shù)量的item
mhandler.sendEmptyMessage(REFRESH); //通知handler更新
}
Handler中用于處理第一次顯示數(shù)據(jù)和以后刷新操作的代碼
if (msg.what == REFRESH) {
if (mAdapter == null) {
mAdapter = new OneAdapter(mContext);
mAdapter.setmDatas(mLists);//設(shè)置數(shù)據(jù)
//...對(duì)適配器的設(shè)置,這里先省去,免得混淆
mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
mRecyclerView.setAdapter(mAdapter);
} else {
mAdapter.setmDatas(mLists);
mAdapter.cleadnCount();
mAdapter.notifyDataSetChanged();
}
initRefresh(); //判斷refreshLayout是否在刷新,是的話取消刷新操作 .就不貼代碼了顯的亂糟糟
RefreshLayout的刷新事件
mRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Thread(mRunnable).start();//runnable調(diào)用了initData()方法;
}
});
此時(shí)就可以對(duì)刷新操作做出響應(yīng)了,與平時(shí)使用RefreshLayout的操作一樣
上拉刷新的實(shí)現(xiàn)思路(主要在適配器中,activity中只需要一個(gè)當(dāng)需要加載更多的時(shí)候更新數(shù)據(jù)源就行)

普通內(nèi)容的布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:scaleType="centerInside"
android:id="@+id/item_head"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_gravity="center"
android:layout_margin="5dp"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="Title"
android:textSize="20sp" />
<TextView
android:id="@+id/item_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="Desc"
android:textSize="16sp" />
<TextView
android:id="@+id/item_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|right"
android:layout_marginRight="14dp"
android:layout_weight="1"
android:gravity="center_vertical|right"
android:text="Time"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
加載更多的內(nèi)容布局(默認(rèn)顯示ProgressBar,沒有更多的圖標(biāo)隱藏)
<?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="40dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/load_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|right"
android:layout_weight="1"
android:scaleType="centerInside"
android:src="@mipmap/ic_launcher"
android:visibility="gone" />
<ProgressBar
android:id="@+id/load_progress"
style="@style/Widget.AppCompat.ProgressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|right"
android:layout_weight="1" />
<TextView
android:id="@+id/load_tv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center_vertical|left"
android:text="正在加載更多...."
android:textColor="@color/colorBlank"
android:textSize="20sp" />
</LinearLayout>
itemCount(因?yàn)槲覀円谧詈箫@示信息,所以item的總數(shù)應(yīng)該是加1,但是也是分情況的:
@Override
public int getItemCount() {
if (mDatas.size() > minShowLoad) { //當(dāng)前item能將屏幕顯示滿
return mDatas.size() + 1; //則默認(rèn)顯示加載或者沒有更多
}
return mDatas.size(); //如果不能顯示滿,則不顯示加載和沒有更多
}
getViewType(根據(jù)不同的位置顯示不同的type)
@Override
public int getItemViewType(int position) {
if (position == mDatas.size()) {
return VIEWTYPE_LOAD; //最后一個(gè)顯示加載信息
}
return VIEWTYPE_CONTENT;//否則顯示正常布局
}
正常內(nèi)容的ViewHolder
//內(nèi)容布局
private class ContentViewHolder extends RecyclerView.ViewHolder {
private TextView mTitle;
private TextView mDesc;
private TextView mTime;
private ImageView mHead;
private View itemView;
public ContentViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
mTitle = (TextView) itemView.findViewById(R.id.item_title);
mDesc = (TextView) itemView.findViewById(R.id.item_desc);
mTime = (TextView) itemView.findViewById(R.id.item_time);
mHead = (ImageView) itemView.findViewById(R.id.item_head);
}
}
加載信息的ViewHolder
//加載更多的布局 (用于顯示正在加載和沒有更多
private class LoadMoreViewHolder extends RecyclerView.ViewHolder {
private ImageView mImage;
private ProgressBar mProgress;
private TextView mMsg;
public LoadMoreViewHolder(View itemView) {
super(itemView);
mImage = (ImageView) itemView.findViewById(R.id.load_image);
mProgress = (ProgressBar) itemView.findViewById(R.id.load_progress);
mMsg = (TextView) itemView.findViewById(R.id.load_tv);
}
}
onCreateViewHolder中初始化不同的ViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = null;
switch (viewType) {
case 1:
itemView = LayoutInflater.from(mContext).inflate(R.layout.load_layout, parent, false);
return new LoadMoreViewHolder(itemView);
case 2:
itemView = LayoutInflater.from(mContext).inflate(R.layout.item_test, parent, false);
return new ContentViewHolder(itemView);
}
return null;
}
定義一個(gè)回調(diào),用于當(dāng)顯示加載的時(shí)候通知activity更新數(shù)據(jù)
public interface onLoadMoreListener {
void loadMore();
}
//全局變量
private onLoadMoreListener onLoadMoreListener;
onBindViewHolder(對(duì)不同的情況進(jìn)行數(shù)據(jù)顯示)
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ContentViewHolder) {
TestModel model = mDatas.get(position);
((ContentViewHolder) holder).mTitle.setText(model.getmTitle());
((ContentViewHolder) holder).mDesc.setText(model.getmDesc());
((ContentViewHolder) holder).mTime.setText(model.getmTime());
} else if (holder instanceof LoadMoreViewHolder) {
if (mDatas.size() < itemsCount) { //沒有更多
((LoadMoreViewHolder) holder).mMsg.setText("沒有更多了~~~");
((LoadMoreViewHolder) holder).mProgress.setVisibility(View.GONE);
((LoadMoreViewHolder) holder).mImage.setVisibility(View.VISIBLE);
} else {
onLoadMoreListener.loadMore();
((LoadMoreViewHolder) holder).mMsg.setText("正在加載更多....");
((LoadMoreViewHolder) holder).mProgress.setVisibility(View.VISIBLE);
((LoadMoreViewHolder) holder).mImage.setVisibility(View.GONE);
}
}
}
加載更多的回調(diào)在Activity中的使用
mAdapter.setOnLoadMoreListener(new OneAdapter.onLoadMoreListener() {
@Override
public void loadMore() {
//增加數(shù)據(jù)到數(shù)據(jù)源中
//調(diào)用adapter的addData方法
//更新適配器顯示
}
}
至此下拉刷新上拉加載就完成了,Demo地址:SwipeToRefreshTest。
以上就是Android自定義下拉刷新上拉加載的全部內(nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 加載頁面遮擋耗時(shí)操作任務(wù)頁面--第三方開源之AndroidProgressLayout
- Android開發(fā)中如何解決Fragment +Viewpager滑動(dòng)頁面重復(fù)加載的問題
- Android中替換WebView加載網(wǎng)頁失敗時(shí)的頁面
- Android中自定義加載樣式圖片的具體實(shí)現(xiàn)
- Android自定義加載loading view動(dòng)畫組件
- Android自定義加載控件實(shí)現(xiàn)數(shù)據(jù)加載動(dòng)畫
- Android自定義view實(shí)現(xiàn)阻尼效果的加載動(dòng)畫
- Android自定義View實(shí)現(xiàn)loading動(dòng)畫加載效果
- Android自定義Dialog實(shí)現(xiàn)文字動(dòng)態(tài)加載效果
- Android實(shí)現(xiàn)自定義加載框的代碼示例
- Android開發(fā)實(shí)現(xiàn)自定義新聞加載頁面功能實(shí)例
相關(guān)文章
Android實(shí)現(xiàn)Gesture手勢識(shí)別用法分析
這篇文章主要介紹了Android實(shí)現(xiàn)Gesture手勢識(shí)別用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android基于Gesture實(shí)現(xiàn)手勢識(shí)別的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-09-09
Android使用手勢監(jiān)聽器GestureDetector遇到的不響應(yīng)問題
這篇文章主要介紹了Android使用手勢監(jiān)聽器GestureDetector遇到的不響應(yīng)問題,具有很好的參考價(jià)值,對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Android開發(fā)手冊(cè)Button按鈕實(shí)現(xiàn)點(diǎn)擊音效
這篇文章主要為大家介紹了Android開發(fā)手冊(cè)Button按鈕實(shí)現(xiàn)點(diǎn)擊音效示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android 使用fast-verification實(shí)現(xiàn)驗(yàn)證碼填寫功能的實(shí)例代碼
這篇文章主要介紹了Android 使用fast-verification實(shí)現(xiàn)驗(yàn)證碼填寫功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
在當(dāng)前Activity之上創(chuàng)建懸浮view之WindowManager懸浮窗效果
這篇文章主要介紹了在當(dāng)前Activity之上創(chuàng)建懸浮view之WindowManager懸浮窗效果的相關(guān)資料,需要的朋友可以參考下2016-01-01
Android開發(fā)之關(guān)閉和打開Speaker(揚(yáng)聲器)的方法
這篇文章主要介紹了Android開發(fā)之關(guān)閉和打開Speaker(揚(yáng)聲器)的方法,結(jié)合實(shí)例形式簡單分析了Android揚(yáng)聲器的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-03-03
Android實(shí)現(xiàn)點(diǎn)擊兩次BACK鍵退出應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)點(diǎn)擊兩次BACK鍵退出應(yīng)用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Flutter runApp GestureBinding使用介紹
這篇文章主要為大家介紹了Flutter runApp GestureBinding使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

