搭建自己的直播平臺,RecycleView下拉重新整理,上拉載入
搭建自己的直播平臺,RecycleView下拉重新整理,上拉載入實現的相關程式碼
android 的下拉重新整理,上拉載入功能,翻頁時顯示從第1頁開始到當前頁面的內容,並且當前顯示的是當前頁的內容;
1. PullRefreshRecyclerView.java : 翻頁控制元件
public class PullRefreshRecyclerView extends LinearLayout implements SwipeRefreshLayout.OnRefreshListener, View.OnTouchListener { private SwipeRefreshLayout swipeRefreshLayout; private RecyclerView recyclerView; private LinearLayout footerView; private OnPullRefreshListener listener; //是否正在重新整理 private boolean isRefreshing = false; //是否正在載入 private boolean isLoading = false; //是否有更多資料 private boolean hasMore = false; public PullRefreshRecyclerView(Context context) { this(context, null); } public PullRefreshRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); initListener(); init(); } private void initView(Context context) { LayoutInflater.from(context).inflate(R.layout.pull_recycler_layout, this, true); swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout); recyclerView = findViewById(R.id.recyclerView); footerView = findViewById(R.id.footerView); } private void initListener() { swipeRefreshLayout.setOnRefreshListener(this); recyclerView.addOnScrollListener(new PullableScroll()); //防止滾動的時候,滑動View recyclerView.setOnTouchListener(this); } private void init() { swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_green_dark, android.R.color.holo_blue_dark, android.R.color.holo_orange_dark); //隱藏垂直滾動條 recyclerView.setVerticalScrollBarEnabled(true); //item高度固定時,設定該選項提高效能 recyclerView.setHasFixedSize(true); //設定item動畫效果 recyclerView.setItemAnimator(new DefaultItemAnimator()); } public void setHasFixedSize(boolean hasFixedSize) { recyclerView.setHasFixedSize(hasFixedSize); } public void setItemAnimator(RecyclerView.ItemAnimator animator) { recyclerView.setItemAnimator(animator); } public void setLayoutManager(RecyclerView.LayoutManager layout) { recyclerView.setLayoutManager(layout); } public void setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled) { recyclerView.setVerticalScrollBarEnabled(verticalScrollBarEnabled); } public void addItemDecoration(RecyclerView.ItemDecoration decor) { recyclerView.addItemDecoration(decor); } public void setAdapter(RecyclerView.Adapter adapter) { recyclerView.setAdapter(adapter); } /** * 設定監聽下拉或上拉的事件 * * @param listener */ public void setOnPullRefreshListener(OnPullRefreshListener listener) { this.listener = listener; } /** * 設定是否有更多資料 * * @param hasMore */ public void setHasMore(boolean hasMore) { this.hasMore = hasMore; } /** * 滾動到頂部 */ public void scrollToTop() { recyclerView.scrollToPosition(0); } /** * 正在重新整理 */ @Override public void onRefresh() { isRefreshing = true; if (listener != null) { listener.onRefresh(); } } /** * 設定是否允許下拉 * * @param enable */ public void setRefreshEnable(boolean enable) { swipeRefreshLayout.setEnabled(enable); } /** * 滾動時判斷能否能重新整理 * * @return */ private boolean isRefreshEnable() { return !isRefreshing && !isLoading; } /** * 正在載入更多 */ public void doLoadMore() { if (!isLoading && hasMore && !isRefreshing) { footerView.setVisibility(View.VISIBLE); isLoading = true; //禁止下拉 setRefreshEnable(false); if (listener != null) { listener.onLoadMore(); } } } /** * 重新整理或載入完成 */ public void refreshOrLoadComplete() { isRefreshing = false; swipeRefreshLayout.setRefreshing(false); isLoading = false; footerView.setVisibility(View.GONE); //允許下拉 this.setEnabled(true); } @Override public boolean onTouch(View v, MotionEvent event) { return isRefreshing || isLoading; } public interface OnPullRefreshListener { /** * 重新整理操作 */ void onRefresh(); /** * 載入操作 */ void onLoadMore(); } /** * 監聽RecycleView滑動底部或頂部 */ class PullableScroll extends RecyclerView.OnScrollListener { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int lastVisibleItem = 0; int firstVisibleItem = 0; RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); int totalItemCount = layoutManager.getItemCount(); if (layoutManager instanceof LinearLayoutManager) { LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager; lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); firstVisibleItem = linearLayoutManager.findFirstCompletelyVisibleItemPosition(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager; // since may lead to the final item has more than one StaggeredGridLayoutManager the particularity of the so here that is an array // this array into an array of position and then take the maximum value that is the last show the position value int[] lastPositions = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()]; staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions); lastVisibleItem = findMax(lastPositions); firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(lastPositions)[0]; } pullRefreshEnable(firstVisibleItem, totalItemCount); if (isSlideToBottom(recyclerView)) { loadMore(dx, dy, lastVisibleItem, totalItemCount); } } private int findMax(int[] lastPositions) { int max = lastPositions[0]; for (int value : lastPositions) { if (value > max) { max = value; } } return max; } } /** * 判斷是否滑動到底部 * * @param recyclerView * @return */ public boolean isSlideToBottom(RecyclerView recyclerView) { if (recyclerView == null) { return false; } if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset() >= recyclerView.computeVerticalScrollRange()) { return true; } return false; } private void loadMore(int dx, int dy, int lastVisibleItem, int totalItemCount) { //滾動到底部時且有更多資料能夠上拉載入 if (lastVisibleItem >= totalItemCount - 1 && (dx > 0 || dy > 0)) { doLoadMore(); } } private void pullRefreshEnable(int firstVisibleItem, int totalItemCount) { //滾動到頂部時能夠下拉重新整理 if (firstVisibleItem == 0 || totalItemCount == 0) { if (isRefreshEnable()) { //允許下拉 setRefreshEnable(true); } } else { //禁止下拉 setRefreshEnable(false); } } }
2. PunishListActivity.java: 呼叫
@Route(path = Page.ACTIVITY_PUNISH_LIST) public class PunishListActivity extends BaseActivity implements View.OnClickListener, PullRefreshRecyclerView.OnPullRefreshListener { private static final String TAG = "PunishListActivity"; private List<PunishBean> punishBeans = new ArrayList<>(); private Context mContext; private EditText et_punish_searchName; private ImageView iv_search; private PullRefreshRecyclerView prr_punish; private String officeName = ""; private int pageNo = 1; private boolean isLastPage = false; private PunishAdapter punishAdapter; @Override public void onBeforeSetContentView() { StatusBarUtil.translucent(this, ContextCompat.getColor(this, R.color.color_0a5fb6)); } @Override public int getLayoutResID() { return R.layout.activity_punish_list; } @Override protected CharSequence setActionBarTitle() { return "行政處罰"; } @Nullable @Override public AppBarConfig getAppBarConfig() { return mAppBarCompat; } @Override public int setActionBarRightVisibility() { return View.VISIBLE; } @Override public CharSequence setActionBarRightText() { return "新增"; } public void onResume(){ super.onResume(); getPunishList(""); } @Override public void initContentView(@Nullable Bundle savedInstanceState) { mContext = PunishListActivity.this; et_punish_searchName = findViewById(R.id.et_punish_searchName); iv_search = findViewById(R.id.iv_search); iv_search.setOnClickListener(this); prr_punish = findViewById(R.id.prr_punish); prr_punish.setOnPullRefreshListener(this); prr_punish.setHasMore(true); } @Override public void initData(@Nullable Bundle savedInstanceState) { punishAdapter = new PunishAdapter(mContext,punishBeans); LinearLayoutManager manager = new LinearLayoutManager(mContext); manager.setOrientation(RecyclerView.VERTICAL); prr_punish.setLayoutManager(manager); prr_punish.setAdapter(punishAdapter); // getPunishList(); } private void getPunishList(String officeName){ HashMap<String, Object> baseParam = WebFrontUtil.getBaseParam(); baseParam.put("pageNo", pageNo); baseParam.put("pageSize", 10); baseParam.put("officeName", officeName); OkHttpUtil.post(TAG, WebApi.PUNISH_LIST_URL, baseParam, new StringCallback() { @Override public void onError(Call call, Exception e, int id) { hideWaitDialog(); Log.d(TAG,""+e); } @Override public void onResponse(String response, int id) { Log.d(TAG,"response==="+response); try { JSONObject object = new JSONObject(response); hideWaitDialog(); if ((int)object.get("code") == 200) { JSONObject object1 = object.getJSONObject("data"); PunishBeanList punishBeanList = new Gson().fromJson(object1.toString(),PunishBeanList.class); Log.d(TAG,"response==="+punishBeanList.getList().size()); if (pageNo == 1) { punishBeans.clear(); } if (punishBeanList.getList() != null && punishBeanList.getList().size() != 0) { List<PunishBean> addPunishs = new ArrayList<>(); addPunishs = punishBeanList.getList(); if (punishBeans.size() > 0) { punishBeans.addAll(addPunishs); punishAdapter.addMoreData(addPunishs); } else { punishBeans = addPunishs; punishAdapter.setData(addPunishs); } if (punishBeanList.isLastPage()) { isLastPage = true; Log.e(TAG,"isLastPage = true "); }else { isLastPage = false; Log.e(TAG,"isLastPage = false "); } } } else { Toast.makeText(mContext,object.get("message").toString(),Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { e.printStackTrace(); } } }); } @Override protected void actionBarRightOnClick() { ARouter.getInstance().build(Page.ACTIVITY_PUNISH_ADD).navigation(); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.iv_search: showWaitDialog(); officeName = et_punish_searchName.getText().toString(); pageNo = 1; isLastPage = false; getPunishList(officeName); break; } } @Override public void onRefresh() { prr_punish.refreshOrLoadComplete(); pageNo = 1; getPunishList(officeName); prr_punish.setRefreshEnable(true); } @Override public void onLoadMore() { Log.d(TAG,"onLoadMore==================="); prr_punish.refreshOrLoadComplete(); if (isLastPage) { prr_punish.setRefreshEnable(false); } else { pageNo += 1; getPunishList(officeName); } } }
以上就是搭建自己的直播平臺,RecycleView下拉重新整理,上拉載入實現的相關程式碼, 更多內容歡迎關注之後的文章
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2839479/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 上拉重新整理,下拉載入
- Flutter——下拉重新整理,上拉載入Flutter
- flutter - listView 下拉重新整理 上拉載入FlutterView
- 上拉載入下拉重新整理瞭解下
- Flutter 實現下拉重新整理&上拉載入Flutter
- Flutter listview下拉重新整理 上拉載入更多FlutterView
- RecyclerView下拉重新整理 上拉載入 原理DemoView
- UITableView:下拉重新整理和上拉載入更多UIView
- 如何實現上拉載入,下拉重新整理?
- Flutter下拉重新整理,上拉載入更多資料Flutter
- ListView下拉重新整理,上拉自動載入更多View
- recyclerView的側拉效果。上拉載入。下拉重新整理,點選事件等等View事件
- uni-app | 上拉載入和下拉重新整理探索APP
- Flutter ListView封裝,下拉重新整理、上拉載入更多FlutterView封裝
- 下拉重新整理,上拉載入外掛mescroll原始碼分析原始碼
- vue 實現上拉載入下拉重新整理(思路賊清晰)Vue
- Flutter 下拉重新整理上拉載入更多Flutter
- 直播平臺搭建,JS實現頁面下拉載入資料操作JS
- 移動端用下拉重新整理的方式實現上拉載入
- 【微信小程式】scroll-view 的上拉載入和下拉重新整理微信小程式View
- 淺談微信小程式中的下拉重新整理和上拉載入微信小程式
- Flutter入門進階之旅(十五)ListView下拉重新整理&上拉載入更多FlutterView
- H5下拉重新整理和上拉載入實現原理淺析H5
- 直播平臺製作,SwipeRefreshLayout下拉重新整理的用法
- HarmonyOS 下拉重新整理 上拉載入更多 第二種實現方式
- 分享輪子-flutter下拉重新整理上拉載入Flutter
- vue-better-scroll 一個vue的上拉載入下拉重新整理外掛Vue
- flutter - RefreshIndicator實現下拉重新整理、上拉載入 | 掘金技術徵文FlutterIndicator
- 給RecyclerView擴充套件下拉重新整理上拉載入View套件
- 微信開發之下拉重新整理上拉載入更多
- Swift iOS : 上拉重新整理或者下拉重新整理SwiftiOS
- 直播原始碼,下拉重新整理和上劃預載入新內容原始碼
- 自己動手寫RecyclerView的上拉載入View
- Movable-view實現列表的下拉重新整理上拉載入View
- 移動端上拉載入和下拉重新整理的vue外掛Vue
- React Native——自定義下拉重新整理上拉載入的列表React Native
- 十分鐘搭建主流框架:下拉/上拉重新整理資料框架
- 從0開始搭建自己的直播平臺