RecyclerView上拉加載封裝代碼
RecyclerView上拉加載,先看效果:

網(wǎng)上有很多這類(lèi)得框架,不過(guò)在自己的項(xiàng)目只用到上拉加載的功能,所以自己封裝一個(gè)簡(jiǎn)單點(diǎn)的。
主要依賴BaseRecyPRAdapter這類(lèi)
public abstract class BaseRecyPRAdapter<T> extends RecyclerView.Adapter<BaseRecyPRAdapter.BaseViewHolder> {
private static final String TAG = "BaseRecyPRAdapter";
public static final int VIEW_ITEM = 0;
public static final int VIEW_PROG = 1;
public List<T> mDataList;
private final Context mContext;
private final RecyclerView mRecyclerView;
private int totalItemCount;
private int lastVisibleItemPosition;
boolean isShowFootVieW = false;
private Handler handler = new Handler();
private static final int STATE_NORMAL = 0;
private static final int STATE_LOADING = 1;
private static final int STATE_LOAD_COMPLETE = 2;
private int mState = STATE_NORMAL;
public BaseRecyPRAdapter(Context context, RecyclerView recyclerView) {
mContext = context;
mRecyclerView = recyclerView;
if (mRecyclerView.getLayoutManager() instanceof LinearLayoutManager) {
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
int extent = recyclerView.computeVerticalScrollExtent();
int range = recyclerView.computeVerticalScrollRange();
Log.e(TAG, "\n extent = " + extent + "\n range = " + range);
if (range > extent) {
if(!isShowFootVieW){
notifyDataSetChanged();
}
isShowFootVieW = true;
} else {
isShowFootVieW = false;
}
totalItemCount = linearLayoutManager.getItemCount();
if (mState == STATE_NORMAL && newState == RecyclerView.SCROLL_STATE_IDLE &&
totalItemCount == lastVisibleItemPosition + 1 && range > extent) {
mState = STATE_LOADING;
handler.post(new Runnable() {
@Override
public void run() {
if (mLoadMoreDataListener != null) {
mLoadMoreDataListener.loadMoreData();
}
}
});
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
}
});
}
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
BaseViewHolder holder = null;
View view = null;
if (viewType == VIEW_PROG) {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer, parent, false);
} else {
view = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);
}
holder = new BaseViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
if (holder.getItemViewType() == BaseRecyPRAdapter.VIEW_PROG) {
// LogTool.LogE_DEBUG(TAG, "onBindViewHolder--->" + mState);
ProgressBar progressBar = (ProgressBar) holder.getView(R.id.progressbar);
TextView text = (TextView) holder.getView(R.id.text);
if (mState == STATE_LOAD_COMPLETE) {
progressBar.setVisibility(View.GONE);
text.setText(mContext.getString(R.string.沒(méi)有數(shù)據(jù)了));
} else {
progressBar.setVisibility(View.VISIBLE);
text.setText(mContext.getString(R.string.正在加載中));
}
}
if (holder.getItemViewType() == BaseRecyPRAdapter.VIEW_ITEM) {
onBindData(holder, position);
}
}
@Override
public int getItemCount() {
if (isShowFootVieW) {
return mDataList == null ? 0 : mDataList.size() + 1;
} else {
return mDataList == null ? 0 : mDataList.size();
}
}
//根據(jù)不同的數(shù)據(jù)返回不同的viewType
@Override
public int getItemViewType(int position) {
if (mDataList == null)
return VIEW_ITEM;
if (position == mDataList.size()) {
return VIEW_PROG;
} else {
return VIEW_ITEM;
}
}
/**
* 根據(jù)type 返回不同的布局
*
* @param type
* @return
*/
public abstract int getLayoutId(int type);
public abstract void onBindData(BaseViewHolder holder, int position);
public static class BaseViewHolder extends RecyclerView.ViewHolder {
private Map<Integer, View> mViewMap;
public View view;
public BaseViewHolder(View itemView) {
super(itemView);
view = itemView;
mViewMap = new HashMap<>();
}
/**
* 獲取設(shè)置的view
*
* @param id
* @return
*/
public View getView(int id) {
View view = mViewMap.get(id);
if (view == null) {
view = itemView.findViewById(id);
mViewMap.put(id, view);
}
return view;
}
}
public void stopLoadMore() {
mState = STATE_NORMAL;
notifyDataSetChanged();
}
public void loadComplete() {
mState = STATE_LOAD_COMPLETE;
notifyItemChanged(getItemCount()-1);
}
public void setData(List<T> datas) {
mDataList = datas;
}
private LoadMoreDataListener mLoadMoreDataListener;
public void setLoadMoreDataListener(LoadMoreDataListener mLoadMoreDataListener) {
this.mLoadMoreDataListener = mLoadMoreDataListener;
}
public interface LoadMoreDataListener {
void loadMoreData();
}
}
在activity中使用:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "RecyActivity";
private RecyclerView mRecyclerView;
private List<String> list = new ArrayList<>();
private MyRecyViewAdapter mAdapter;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
initView();
initData();
initListener();
}
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//創(chuàng)建一個(gè)LinearLayoutManager對(duì)象
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(
this, LinearLayoutManager.VERTICAL, false);
mRecyclerView.setLayoutManager(linearLayoutManager);
//創(chuàng)建adapter對(duì)象
mAdapter = new MyRecyViewAdapter(this, mRecyclerView);
mRecyclerView.setAdapter(mAdapter);
mAdapter.setData(list);//設(shè)置數(shù)據(jù)
}
//初始化數(shù)據(jù)
private void initData() {
for (int i = 0; i < 15; i++) {
list.add("DATA---------->" + i);
}
}
//初始化監(jiān)聽(tīng)
private void initListener() {
//加載更多回調(diào)監(jiān)聽(tīng)
mAdapter.setLoadMoreDataListener(new BaseRecyPRAdapter.LoadMoreDataListener() {
@Override
public void loadMoreData() {
//加入null值此時(shí)adapter會(huì)判斷item的type
Log.e(TAG, "loadMoreData--->");
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (list.size() < 30) {
for (int i = 0; i < 5; i++) {
list.add("LOAD MORE DATA---------->" + i);
}
mAdapter.stopLoadMore();
} else {
mAdapter.loadComplete();
}
}
}, 500);
}
});
}
class MyRecyViewAdapter extends BaseRecyPRAdapter<String> {
public MyRecyViewAdapter(Context context, RecyclerView recyclerView) {
super(context, recyclerView);
}
@Override
public int getLayoutId(int type) {
return R.layout.item_view;
}
@Override
public void onBindData(BaseViewHolder holder, int position) {
Log.e(TAG, "onBindData--->" + position);
if (mDataList == null || mDataList.isEmpty())
return;
TextView tv = (TextView) holder.getView(R.id.tv_name);
if (tv != null) {
tv.setText("DATA--------->" + position);
}
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android中使用RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載
- Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載
- Android RecyclerView 上拉加載更多及下拉刷新功能的實(shí)現(xiàn)方法
- Android使用recyclerview打造真正的下拉刷新上拉加載效果
- Android RecyclerView添加上拉加載更多效果
- android RecyclerView側(cè)滑菜單,滑動(dòng)刪除,長(zhǎng)按拖拽,下拉刷新上拉加載
- Android RecyclerView下拉刷新和上拉加載更多
- Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載更多
- Android RecyclerView上拉加載更多功能回彈實(shí)現(xiàn)代碼
- Android RecyclerView添加上拉加載更多功能
相關(guān)文章
Android開(kāi)發(fā)中ListView自定義adapter的封裝
這篇文章主要為大家詳細(xì)介紹了android開(kāi)發(fā)中ListView自定義adapter的封裝,ListView的模板寫(xiě)法,感興趣的小伙伴們可以參考一下2016-09-09
詳解Android如何實(shí)現(xiàn)好的彈層體驗(yàn)效果
當(dāng)前?App?的設(shè)計(jì)趨勢(shì)越來(lái)越希望給用戶沉浸式體驗(yàn),這種設(shè)計(jì)會(huì)讓用戶盡量停留在當(dāng)前的界面,而不需要太多的跳轉(zhuǎn),這就需要引入彈層。本篇我們就來(lái)講講彈層這塊需要注意哪些用戶體驗(yàn)2022-11-11
android 修改launcher行數(shù)和列數(shù)的方法
這篇文章主要介紹了android 修改launcher行數(shù)和列數(shù)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
Android實(shí)現(xiàn)點(diǎn)擊某個(gè)按鈕指定位置彈出布局
這篇文章主要介紹了Android實(shí)現(xiàn)點(diǎn)擊某個(gè)按鈕指定位置彈出布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
微信小程序動(dòng)態(tài)的顯示或隱藏控件的方法(兩種方法)
在微信小程序開(kāi)發(fā)時(shí),經(jīng)常要用到一個(gè)控件會(huì)根據(jù)不同的情況和環(huán)境動(dòng)態(tài)顯示與隱藏這種情況,下面就來(lái)實(shí)踐一下吧2017-01-01

