日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

android RecycleView實現下拉刷新和上拉加載

瀏覽:98日期:2022-09-23 14:36:28

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); } }}

3.PunishAdapter.java

public class PunishAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private List<PunishBean> punishList; public PunishAdapter(Context mContext, List<PunishBean> punishList) { this.mContext = mContext; this.punishList = punishList; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.punish_item,parent,false); PunishHolder punishHolder = new PunishHolder(view); return punishHolder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { PunishBean punishBean = punishList.get(position); PunishHolder punishHolder = (PunishHolder) holder; punishHolder.tv_punishName.setText(punishBean.getOfficeName()); punishHolder.tv_faren.setText(punishBean.getLegalPerson()); punishHolder.tv_punishMode.setText(punishBean.getPunishWay()); punishHolder.tv_punishReason.setText(punishBean.getReason()); punishHolder.tv_punishTime.setText(punishBean.getUpdateTime()); punishHolder.tv_punishDesc.setText(punishBean.getRemarks()); punishHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Bundle bundle = new Bundle(); bundle.putSerializable('punishDetail',punishBean); ARouter.getInstance().build(Page.ACTIVITY_PUNISH_DETAIL).with(bundle).navigation(); } }); } /* * 向列表尾部添加數據 * */ public void addMoreData(List<PunishBean> list) { int oldSize = punishList.size(); if (list != null && list.size() > 0) { punishList.addAll(punishList.size(), list); notifyItemRangeInserted(oldSize, list.size()); } } /* * 填充新數據 * */ public void setData(List<PunishBean> data) { if (data != null && data.size() > 0) { punishList.clear(); punishList.addAll(data); notifyDataSetChanged(); } } @Override public int getItemCount() { return punishList==null? 0:punishList.size(); } class PunishHolder extends RecyclerView.ViewHolder { private TextView tv_punishName,tv_faren,tv_punishMode,tv_punishReason,tv_punishTime,tv_punishDesc; public PunishHolder(@NonNull View itemView) { super(itemView); tv_punishName = itemView.findViewById(R.id.tv_punishName); tv_faren = itemView.findViewById(R.id.tv_faren); tv_punishMode = itemView.findViewById(R.id.tv_punishMode); tv_punishReason = itemView.findViewById(R.id.tv_punishReason); tv_punishTime = itemView.findViewById(R.id.tv_punishTime); tv_punishDesc = itemView.findViewById(R.id.tv_punishDesc); } }}

4.布局文件:

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' xmlns:tools='http://schemas.android.com/tools' android:fitsSystemWindows='true' android:orientation='vertical' android:layout_margin='@dimen/px40' android:background='@color/color_ffffff' android:layout_width='match_parent' android:layout_height='match_parent' tools:context='.modules.punish.PunishListActivity'> <RelativeLayout android: android:layout_width='match_parent' android:layout_marginTop='@dimen/px20' android:layout_height='103px' android:background='@drawable/bg_radius_blue'> <EditText android: android:layout_width='match_parent' android:layout_height='match_parent' android:layout_marginStart='@dimen/px44' android:layout_marginEnd='@dimen/px110' android:background='@null' android:hint='請輸入單位名稱' android:inputType='text' android:textColor='@color/color_hint' android:textColorHint='@color/color_hint' android:textSize='@dimen/font_14' /> <ImageView android: android:layout_width='@dimen/px54' android:layout_height='@dimen/px54' android:layout_alignParentEnd='true' android:layout_centerVertical='true' android:layout_marginEnd='@dimen/px50' android:src='http://www.b3g6.com/bcjs/@drawable/icon_text_search' /> </RelativeLayout> <com.nmpa.nmpaapp.widget.PullRefreshRecyclerView android: android:layout_width='match_parent' android:layout_height='wrap_content'/></LinearLayout>

本文已經被整理到《Android下拉刷新上拉加載效果》,歡迎大家學習研究。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产不卡| 久久精品99久久无色码中文字幕| 欧美国产视频| 国产午夜久久| 国产精品黄网站| 欧美日韩一二| 国产欧美日韩在线一区二区 | 国产成人调教视频在线观看| 亚洲日产国产精品| 9色精品在线| 麻豆成人综合网| 婷婷成人av| 蜜芽一区二区三区| 亚洲一二三区视频| 国产毛片精品久久| 麻豆91小视频| 国产一区二区中文| 欧美日一区二区在线观看| 麻豆传媒一区二区三区| 99视频精品全部免费在线视频| 一本一道久久a久久精品蜜桃| 蜜臀精品久久久久久蜜臀| 国产精品视频一区视频二区| 中文字幕一区久| 日韩中文字幕区一区有砖一区 | 国产伦精品一区二区三区在线播放| 黄色欧美在线| 欧美日韩国产探花| 中文字幕日韩欧美精品高清在线| 国产精品88久久久久久| 国产精品呻吟| 91亚洲国产高清| 日韩精品专区| 免费观看在线色综合| 另类欧美日韩国产在线| 精品视频自拍| 婷婷五月色综合香五月| 日韩精品欧美| 五月精品视频| 国产日韩免费| 欧美精品观看| 欧美va天堂在线| 福利一区二区免费视频| 香蕉久久99| 国产麻豆一区二区三区| 视频一区二区三区中文字幕| 麻豆国产欧美一区二区三区 | 在线一区免费| 国产欧美高清| 蜜臀精品一区二区三区在线观看| www在线观看黄色| 欧美极品一区二区三区| 日韩不卡在线观看日韩不卡视频| 亚洲91视频| 国产成人精品一区二区三区免费| 亚洲精品乱码| 日韩精品一级二级| 欧美日韩国产免费观看视频| 激情综合五月| 欧美黑人做爰爽爽爽| 7m精品国产导航在线| 日韩在线观看中文字幕| 老牛影视一区二区三区| 99久久精品费精品国产| 日韩av片子| 老牛影视精品| 桃色一区二区| 精品中文字幕一区二区三区av| 丁香六月综合| se01亚洲视频| 午夜国产精品视频免费体验区| 久久久蜜桃一区二区人| 久久狠狠婷婷| 久久福利精品| 日韩精彩视频在线观看| 国产情侣久久| 黄色aa久久| 日韩午夜黄色| 亚洲综合欧美| 日韩av影院| 国产传媒av在线| 亚洲国产成人精品女人| 国产精品毛片在线看| 日韩精品第一| 日韩三区免费| 日韩三级精品| 亚洲精品影视| 日韩国产欧美三级| 日本一区二区免费高清| 狠狠干综合网| 麻豆视频一区二区| 亚洲激情偷拍| 国产福利一区二区精品秒拍| 国产中文欧美日韩在线| 波多野结衣一区| 日本成人精品| 欧美日韩一区自拍| 日本在线精品| 欧美日一区二区在线观看| 日韩精品1区| 日韩av不卡在线观看| 蜜臀国产一区| 欧美天堂一区| 久久国产精品久久久久久电车| 国产欧美日韩一区二区三区四区| 亚洲va在线| 老司机精品视频网| 亚洲精选成人| 亚洲不卡av不卡一区二区| 亚洲三级av| 中文亚洲免费| 色网在线免费观看| 91精品尤物| 亚洲+小说+欧美+激情+另类| 久久高清免费| 欧美sss在线视频| 成人在线免费观看网站| 日韩av一区二| 亚洲免费在线| 国产高清一区| 亚洲女同一区| 婷婷激情图片久久| 久久激情婷婷| 婷婷成人基地| 欧美片第1页| 久久视频精品| 欧美精选一区二区三区| 欧美成人综合| 不卡视频在线| 亚洲色诱最新| 亚洲字幕久久| 亚洲啊v在线免费视频| 天堂av在线一区| 亚洲精选久久| 国产精品视频一区二区三区 | 精品午夜视频| 日韩精品第一区| 国产成人精品一区二区三区视频 | 91欧美国产| 亚洲高清成人| 亚洲欧美日韩国产一区二区| 丝袜脚交一区二区| 国产精品欧美三级在线观看| 老牛国内精品亚洲成av人片| 国产91在线精品| 久久婷婷久久| 亚洲精一区二区三区| 青草av.久久免费一区| 免费一区二区三区在线视频| 麻豆视频在线观看免费网站黄| av成人国产| 国产人成精品一区二区三| 捆绑调教日本一区二区三区| 影音国产精品| 麻豆高清免费国产一区| 99国产精品久久久久久久| 国产亚洲字幕| av一区二区高清| 精品亚洲a∨一区二区三区18| 中文一区二区| 国产成人精选| 青青草国产成人99久久| 精品国产一区二区三区av片| 老鸭窝毛片一区二区三区| 精品中文在线| 日本一区二区三区视频在线看| 免费一二一二在线视频| 青草国产精品| 99在线精品免费视频九九视| 精品丝袜久久| 18国产精品| 午夜在线视频一区二区区别| 精品久久97| 国产欧美在线观看免费| 免费久久精品视频| 美女网站视频一区| 波多野结衣久久精品| 日本一区二区三区视频在线看 | 麻豆91小视频| 久久国产生活片100| 视频在线观看一区二区三区| www.com.cn成人| 老司机精品视频网| 国产日韩1区| 日韩高清国产一区在线| 羞羞答答国产精品www一本| av高清不卡| 久久蜜桃精品| 999国产精品999久久久久久| 精品久久中文| 欧美日韩黄网站| 欧美一区在线观看视频| 日韩不卡在线观看日韩不卡视频| 亚洲欧美日韩专区| 亚洲精品97| 亚洲中午字幕| 亚洲一级在线| 日韩一区二区久久| 视频在线观看国产精品| 亚洲女人av|