搭建自己的直播平台,RecycleView下拉刷新,上拉加载
搭建自己的直播平台,RecycleView下拉刷新,上拉加载实现的相关代码
android 的下拉刷新,上拉加载功能,翻页时显示从第1页开始到当前页面的内容,并且当前显示的是当前页的内容;
1. PullRefreshRecyclerView.java : 翻页控件
1 | public class PullRefreshRecyclerView extends LinearLayout implements SwipeRefreshLayout.OnRefreshListener, View.OnTouchListener {<br> private SwipeRefreshLayout swipeRefreshLayout;<br> private RecyclerView recyclerView;<br> private LinearLayout footerView;<br> private OnPullRefreshListener listener;<br> //是否正在刷新<br> private boolean isRefreshing = false;<br> //是否正在加载<br> private boolean isLoading = false;<br> <br> //是否有更多数据<br> private boolean hasMore = false;<br> <br> public PullRefreshRecyclerView(Context context) {<br> this(context, null);<br> }<br> <br> public PullRefreshRecyclerView(Context context, AttributeSet attrs) {<br> super(context, attrs);<br> initView(context);<br> initListener();<br> init();<br> }<br> <br> private void initView(Context context) {<br> LayoutInflater.from(context).inflate(R.layout.pull_recycler_layout, this, true);<br> swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout);<br> recyclerView = findViewById(R.id.recyclerView);<br> footerView = findViewById(R.id.footerView);<br> <br> }<br> <br> private void initListener() {<br> swipeRefreshLayout.setOnRefreshListener(this);<br> recyclerView.addOnScrollListener(new PullableScroll());<br> //防止滚动的时候,滑动View<br> recyclerView.setOnTouchListener(this);<br> }<br> <br> private void init() {<br> swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_green_dark,<br> android.R.color.holo_blue_dark,<br> android.R.color.holo_orange_dark);<br> //隐藏垂直滚动条<br> recyclerView.setVerticalScrollBarEnabled(true);<br> //item高度固定时,设置该选项提高性能<br> recyclerView.setHasFixedSize(true);<br> //设置item动画效果<br> recyclerView.setItemAnimator(new DefaultItemAnimator());<br> }<br> <br> public void setHasFixedSize(boolean hasFixedSize) {<br> recyclerView.setHasFixedSize(hasFixedSize);<br> }<br> <br> public void setItemAnimator(RecyclerView.ItemAnimator animator) {<br> recyclerView.setItemAnimator(animator);<br> }<br> <br> public void setLayoutManager(RecyclerView.LayoutManager layout) {<br> recyclerView.setLayoutManager(layout);<br> }<br> <br> public void setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled) {<br> recyclerView.setVerticalScrollBarEnabled(verticalScrollBarEnabled);<br> }<br> <br> public void addItemDecoration(RecyclerView.ItemDecoration decor) {<br> recyclerView.addItemDecoration(decor);<br> <br> }<br> <br> public void setAdapter(RecyclerView.Adapter adapter) {<br> recyclerView.setAdapter(adapter);<br> }<br> <br> /**<br> * 设置监听下拉或上拉的事件<br> *<br> * @param listener<br> */<br> public void setOnPullRefreshListener(OnPullRefreshListener listener) {<br> this.listener = listener;<br> }<br> <br> /**<br> * 设置是否有更多数据<br> *<br> * @param hasMore<br> */<br> public void setHasMore(boolean hasMore) {<br> this.hasMore = hasMore;<br> }<br> <br> /**<br> * 滚动到顶部<br> */<br> public void scrollToTop() {<br> recyclerView.scrollToPosition(0);<br> }<br> <br> /**<br> * 正在刷新<br> */<br> @Override<br> public void onRefresh() {<br> isRefreshing = true;<br> if (listener != null) {<br> listener.onRefresh();<br> }<br> <br> }<br> <br> /**<br> * 设置是否允许下拉<br> *<br> * @param enable<br> */<br> public void setRefreshEnable(boolean enable) {<br> swipeRefreshLayout.setEnabled(enable);<br> }<br> <br> /**<br> * 滚动时判断能否能刷新<br> *<br> * @return<br> */<br> private boolean isRefreshEnable() {<br> return !isRefreshing && !isLoading;<br> }<br> <br> /**<br> * 正在加载更多<br> */<br> public void doLoadMore() {<br> if (!isLoading && hasMore && !isRefreshing) {<br> footerView.setVisibility(View.VISIBLE);<br> isLoading = true;<br> //禁止下拉<br> setRefreshEnable(false);<br> if (listener != null) {<br> listener.onLoadMore();<br> }<br> }<br> }<br> <br> /**<br> * 刷新或加载完成<br> */<br> public void refreshOrLoadComplete() {<br> isRefreshing = false;<br> swipeRefreshLayout.setRefreshing(false);<br> isLoading = false;<br> footerView.setVisibility(View.GONE);<br> //允许下拉<br> this.setEnabled(true);<br> }<br> <br> @Override<br> public boolean onTouch(View v, MotionEvent event) {<br> return isRefreshing || isLoading;<br> }<br> <br> public interface OnPullRefreshListener {<br> /**<br> * 刷新操作<br> */<br> void onRefresh();<br> <br> /**<br> * 加载操作<br> */<br> void onLoadMore();<br> }<br> <br> /**<br> * 监听RecycleView滑动底部或顶部<br> */<br> class PullableScroll extends RecyclerView.OnScrollListener {<br> @Override<br> public void onScrolled(RecyclerView recyclerView, int dx, int dy) {<br> super.onScrolled(recyclerView, dx, dy);<br> int lastVisibleItem = 0;<br> int firstVisibleItem = 0;<br> RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();<br> int totalItemCount = layoutManager.getItemCount();<br> if (layoutManager instanceof LinearLayoutManager) {<br> LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;<br> lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();<br> firstVisibleItem = linearLayoutManager.findFirstCompletelyVisibleItemPosition();<br> } else if (layoutManager instanceof StaggeredGridLayoutManager) {<br> StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;<br> // since may lead to the final item has more than one StaggeredGridLayoutManager the particularity of the so here that is an array<br> // this array into an array of position and then take the maximum value that is the last show the position value<br> int[] lastPositions = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];<br> staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions);<br> lastVisibleItem = findMax(lastPositions);<br> firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(lastPositions)[0];<br> }<br> <br> pullRefreshEnable(firstVisibleItem, totalItemCount);<br> if (isSlideToBottom(recyclerView)) {<br> loadMore(dx, dy, lastVisibleItem, totalItemCount);<br> }<br> <br> }<br> <br> private int findMax(int[] lastPositions) {<br> int max = lastPositions[0];<br> for (int value : lastPositions) {<br> if (value > max) {<br> max = value;<br> }<br> }<br> return max;<br> }<br> }<br> <br> /**<br> * 判断是否滑动到底部<br> *<br> * @param recyclerView<br> * @return<br> */<br> public boolean isSlideToBottom(RecyclerView recyclerView) {<br> if (recyclerView == null) {<br> return false;<br> }<br> if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset()<br> >= recyclerView.computeVerticalScrollRange()) {<br> return true;<br> }<br> return false;<br> }<br> <br> private void loadMore(int dx, int dy, int lastVisibleItem, int totalItemCount) {<br> //滚动到底部时且有更多数据能够上拉加载<br> if (lastVisibleItem >= totalItemCount - 1 && (dx > 0 || dy > 0)) {<br> doLoadMore();<br> }<br> }<br> <br> private void pullRefreshEnable(int firstVisibleItem, int totalItemCount) {<br> //滚动到顶部时能够下拉刷新<br> if (firstVisibleItem == 0 || totalItemCount == 0) {<br> if (isRefreshEnable()) {<br> //允许下拉<br> setRefreshEnable(true);<br> }<br> } else {<br> //禁止下拉<br> setRefreshEnable(false);<br> }<br> }<br> <br>} |
2. PunishListActivity.java: 调用
1 | @Route (path = Page.ACTIVITY_PUNISH_LIST)<br> public class PunishListActivity extends BaseActivity implements View.OnClickListener, PullRefreshRecyclerView.OnPullRefreshListener {<br> private static final String TAG = "PunishListActivity" ;<br> private List<PunishBean> punishBeans = new ArrayList<>();<br> private Context mContext;<br> private EditText et_punish_searchName;<br> private ImageView iv_search;<br> private PullRefreshRecyclerView prr_punish;<br> private String officeName = "" ;<br> private int pageNo = 1 ;<br> private boolean isLastPage = false ;<br> private PunishAdapter punishAdapter;<br> <br> @Override <br> public void onBeforeSetContentView() {<br> StatusBarUtil.translucent( this , ContextCompat.getColor( this , R.color.color_0a5fb6));<br> }<br> <br> @Override <br> public int getLayoutResID() {<br> return R.layout.activity_punish_list;<br> }<br> <br> @Override <br> protected CharSequence setActionBarTitle() {<br> return "行政处罚" ;<br> }<br> @Nullable <br> @Override <br> public AppBarConfig getAppBarConfig() {<br> return mAppBarCompat;<br> }<br> <br> @Override <br> public int setActionBarRightVisibility() {<br> return View.VISIBLE;<br> }<br> <br> @Override <br> public CharSequence setActionBarRightText() {<br> return "添加" ;<br> }<br> <br> public void onResume(){<br> super .onResume();<br> getPunishList( "" );<br> }<br> <br> @Override <br> public void initContentView( @Nullable Bundle savedInstanceState) {<br> mContext = PunishListActivity. this ;<br> et_punish_searchName = findViewById(R.id.et_punish_searchName);<br> iv_search = findViewById(R.id.iv_search);<br> iv_search.setOnClickListener( this );<br> prr_punish = findViewById(R.id.prr_punish);<br> prr_punish.setOnPullRefreshListener( this );<br> prr_punish.setHasMore( true );<br> }<br> <br> @Override <br> public void initData( @Nullable Bundle savedInstanceState) {<br> punishAdapter = new PunishAdapter(mContext,punishBeans);<br> LinearLayoutManager manager = new LinearLayoutManager(mContext);<br> manager.setOrientation(RecyclerView.VERTICAL);<br> prr_punish.setLayoutManager(manager);<br> prr_punish.setAdapter(punishAdapter);<br> // getPunishList();<br> }<br> <br> private void getPunishList(String officeName){<br> HashMap<String, Object> baseParam = WebFrontUtil.getBaseParam();<br> baseParam.put("pageNo", pageNo);<br> baseParam.put("pageSize", 10);<br> <br> baseParam.put("officeName", officeName);<br> OkHttpUtil.post(TAG, WebApi.PUNISH_LIST_URL, baseParam, new StringCallback() {<br> @Override<br> public void onError(Call call, Exception e, int id) {<br> hideWaitDialog();<br> Log.d(TAG,""+e);<br> }<br> <br> @Override<br> public void onResponse(String response, int id) {<br> Log.d(TAG,"response==="+response);<br> try {<br> JSONObject object = new JSONObject(response);<br> hideWaitDialog();<br> if ((int)object.get("code") == 200) {<br> JSONObject object1 = object.getJSONObject("data");<br> PunishBeanList punishBeanList = new Gson().fromJson(object1.toString(),PunishBeanList.class);<br> Log.d(TAG,"response==="+punishBeanList.getList().size());<br> if (pageNo == 1) {<br> punishBeans.clear();<br> }<br> if (punishBeanList.getList() != null && punishBeanList.getList().size() != 0) {<br> List<PunishBean> addPunishs = new ArrayList<>();<br> addPunishs = punishBeanList.getList();<br> if (punishBeans.size() > 0) {<br> punishBeans.addAll(addPunishs);<br> punishAdapter.addMoreData(addPunishs);<br> } else {<br> punishBeans = addPunishs;<br> punishAdapter.setData(addPunishs);<br> }<br> <br> if (punishBeanList.isLastPage()) {<br> isLastPage = true;<br> Log.e(TAG,"isLastPage = true ");<br> }else {<br> isLastPage = false;<br> Log.e(TAG,"isLastPage = false ");<br> }<br> }<br> } else {<br> Toast.makeText(mContext,object.get("message").toString(),Toast.LENGTH_SHORT).show();<br> }<br> } catch (JSONException e) {<br> e.printStackTrace();<br> }<br> }<br> });<br> }<br> <br> @Override<br> protected void actionBarRightOnClick() {<br> ARouter.getInstance().build(Page.ACTIVITY_PUNISH_ADD).navigation();<br> }<br> <br> @Override<br> public void onClick(View view) {<br> switch (view.getId()) {<br> case R.id.iv_search:<br> showWaitDialog();<br> officeName = et_punish_searchName.getText().toString();<br> pageNo = 1;<br> isLastPage = false;<br> getPunishList(officeName);<br> break;<br> }<br> }<br> <br> @Override<br> public void onRefresh() {<br> prr_punish.refreshOrLoadComplete();<br> pageNo = 1;<br> getPunishList(officeName);<br> prr_punish.setRefreshEnable(true);<br> }<br> <br> @Override<br> public void onLoadMore() {<br> Log.d(TAG,"onLoadMore===================");<br> prr_punish.refreshOrLoadComplete();<br> if (isLastPage) {<br> prr_punish.setRefreshEnable(false);<br> } else {<br> pageNo += 1;<br> getPunishList(officeName);<br> }<br> }<br>} |
以上就是搭建自己的直播平台,RecycleView下拉刷新,上拉加载实现的相关代码, 更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!