RecyclerView上拉加載封裝代碼
更新時間:2017年08月26日 08:31:54 作者:desireyao
這篇文章主要為大家詳細介紹了RecyclerView上拉加載封裝代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
RecyclerView上拉加載,先看效果:
網(wǎng)上有很多這類得框架,不過在自己的項目只用到上拉加載的功能,所以自己封裝一個簡單點的。
主要依賴BaseRecyPRAdapter這類
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.沒有數(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<>(); } /** * 獲取設置的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)建一個LinearLayoutManager對象 LinearLayoutManager linearLayoutManager = new LinearLayoutManager( this, LinearLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(linearLayoutManager); //創(chuàng)建adapter對象 mAdapter = new MyRecyViewAdapter(this, mRecyclerView); mRecyclerView.setAdapter(mAdapter); mAdapter.setData(list);//設置數(shù)據(jù) } //初始化數(shù)據(jù) private void initData() { for (int i = 0; i < 15; i++) { list.add("DATA---------->" + i); } } //初始化監(jiān)聽 private void initListener() { //加載更多回調(diào)監(jiān)聽 mAdapter.setLoadMoreDataListener(new BaseRecyPRAdapter.LoadMoreDataListener() { @Override public void loadMoreData() { //加入null值此時adapter會判斷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); } } } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Android中使用RecyclerView實現(xiàn)下拉刷新和上拉加載
- Android RecyclerView實現(xiàn)下拉刷新和上拉加載
- Android RecyclerView 上拉加載更多及下拉刷新功能的實現(xiàn)方法
- Android使用recyclerview打造真正的下拉刷新上拉加載效果
- Android RecyclerView添加上拉加載更多效果
- android RecyclerView側(cè)滑菜單,滑動刪除,長按拖拽,下拉刷新上拉加載
- Android RecyclerView下拉刷新和上拉加載更多
- Android RecyclerView實現(xiàn)下拉刷新和上拉加載更多
- Android RecyclerView上拉加載更多功能回彈實現(xiàn)代碼
- Android RecyclerView添加上拉加載更多功能
相關文章
Android開發(fā)中ListView自定義adapter的封裝
這篇文章主要為大家詳細介紹了android開發(fā)中ListView自定義adapter的封裝,ListView的模板寫法,感興趣的小伙伴們可以參考一下2016-09-09android 修改launcher行數(shù)和列數(shù)的方法
這篇文章主要介紹了android 修改launcher行數(shù)和列數(shù)的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07