android item弹出popupwindow recycleview_Android实现RecycleView嵌套RecycleView中的item自动循环滚动功能...
生活随笔
收集整理的這篇文章主要介紹了
android item弹出popupwindow recycleview_Android实现RecycleView嵌套RecycleView中的item自动循环滚动功能...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用RecyclerView實現無限循環滾動
一、先上效果圖
二、GitHub地址
GitHub地址 https://github.com/MNXP/AutomaticRolling?三、思路
RecycleView實現,內部實現Runnable滾動四、實現
1)內部實現Runnable
static class AutoPollTask implements Runnable { private final WeakReference mReference; /** * 使用弱引用持有外部類引用,防止內存泄漏 */ private AutoPollTask(AutoPollRecyclerView reference) { this.mReference = new WeakReference<>(reference); } @Override public void run() { AutoPollRecyclerView recyclerView = mReference.get(); if (recyclerView != null && recyclerView.running) { recyclerView.scrollBy(2, 2);//每次滾動距離 /** * 判斷是否為無限循環 */ if (recyclerView.canRun){ /** * 判斷是否觸底 */ if (isSlideToBottom(recyclerView)) { /**跳至頂部*/ recyclerView.smoothScrollToPosition(0); } } recyclerView.postDelayed(recyclerView.autoPollTask,TIME_AUTO_POLL); } } } /**判斷Recycler是否滑動至最底部 是返回true 不是返回false*/ public static boolean isSlideToBottom(RecyclerView recyclerView) { if (recyclerView == null) return false; if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset() >= recyclerView.computeVerticalScrollRange()) return true; return false; }2)開啟滾動
//開啟 public void start() { if (running){ return; } canRun = true; running = true; postDelayed(autoPollTask,TIME_AUTO_POLL); } public void setCanRun(boolean canRun){ this.canRun = canRun; }3)設置最大高度(沒用到可以去掉)
@Override protected void onMeasure(int widthSpec, int heightSpec) { super.onMeasure(widthSpec, heightSpec); int heightMode = MeasureSpec.getMode(heightSpec); int heightSize = MeasureSpec.getSize(heightSpec); if (heightMode == MeasureSpec.EXACTLY) { heightSize = heightSize <= mMaxHeight ? heightSize : (int) mMaxHeight; } if (heightMode == MeasureSpec.UNSPECIFIED) { heightSize = heightSize <= mMaxHeight ? heightSize : (int) mMaxHeight; } if (heightMode == MeasureSpec.AT_MOST) { heightSize = heightSize <= mMaxHeight ? heightSize : (int) mMaxHeight; } int maxHeightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode); super.onMeasure(widthSpec, maxHeightMeasureSpec); }4)自身Adapter設置
@Override public int getItemCount() { if (mData!=null){ if (mData.size()<=3) return mData.size(); else return mData.size()*20;//return Integer.MAX_VALUE; }else { return 0; }????}5)引用
autoPollRecyclerView = (AutoPollRecyclerView) itemView.findViewById(R.id.main_recycler);autoPollRecyclerView.start();autoPollRecyclerView.setNestedScrollingEnabled(false);autoPollRecyclerView.setLayoutManager(new LinearLayoutManager(context,LinearLayoutManager.VERTICAL, false));((SimpleItemAnimator) autoPollRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);/*** 我的是超過3項開始滾動*/if (item.list.size() > 0) { if (item.list.size() <= 3) { viewHolder.autoPollRecyclerView.setCanRun(false); } else { viewHolder.autoPollRecyclerView.setCanRun(true); }}6)自動滾動RecycleView完整代碼
public class AutoPollRecyclerView extends RecyclerView { private static final long TIME_AUTO_POLL = 30; private AutoPollTask autoPollTask; private boolean running; //是否正在自動輪詢 private boolean canRun;//是否可以自動輪詢,可在不需要的是否置false private int mMaxHeight;//最大高度 public AutoPollRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); autoPollTask = new AutoPollTask(this); mMaxHeight = dip2px(context,100); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { return false; } static class AutoPollTask implements Runnable { private final WeakReference mReference; /** * 使用弱引用持有外部類引用,防止內存泄漏 */ private AutoPollTask(AutoPollRecyclerView reference) { this.mReference = new WeakReference<>(reference); } @Override public void run() { AutoPollRecyclerView recyclerView = mReference.get(); if (recyclerView != null && recyclerView.running) { recyclerView.scrollBy(2, 2);//每次滾動距離 /** * 判斷是否為無限循環 */ if (recyclerView.canRun){ /** * 判斷是否觸底 */ if (isSlideToBottom(recyclerView)) { /**跳至頂部*/ recyclerView.smoothScrollToPosition(0); } } recyclerView.postDelayed(recyclerView.autoPollTask,TIME_AUTO_POLL); } } } /**判斷Recycler是否滑動至最底部 是返回true 不是返回false*/ public static boolean isSlideToBottom(RecyclerView recyclerView) { if (recyclerView == null) return false; if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset() >= recyclerView.computeVerticalScrollRange()) return true; return false; } @Override protected void onMeasure(int widthSpec, int heightSpec) { super.onMeasure(widthSpec, heightSpec); int heightMode = MeasureSpec.getMode(heightSpec); int heightSize = MeasureSpec.getSize(heightSpec); if (heightMode == MeasureSpec.EXACTLY) { heightSize = heightSize <= mMaxHeight ? heightSize : (int) mMaxHeight; } if (heightMode == MeasureSpec.UNSPECIFIED) { heightSize = heightSize <= mMaxHeight ? heightSize : (int) mMaxHeight; } if (heightMode == MeasureSpec.AT_MOST) { heightSize = heightSize <= mMaxHeight ? heightSize : (int) mMaxHeight; } int maxHeightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode); super.onMeasure(widthSpec, maxHeightMeasureSpec); } //開啟 public void start() { if (running){ return; } canRun = true; running = true; postDelayed(autoPollTask,TIME_AUTO_POLL); } public void setCanRun(boolean canRun){ this.canRun = canRun; } /** * 根據手機的分辨率從 dp 的單位 轉成為 px(像素) */ public int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f);????}}7)小小的建議
RecycleView實現,首頁列表,加載圖片有卡頓 卡頓優化可以使用vLayout(阿里開源庫)處理挺好的,它只要是用于處理列表不同布局 vLayout地址 (https://github.com/alibaba/vlayout)到這里就結束啦.往期精彩回顧:Android實現短信驗證碼自動填充功能
Android仿echo精美彈幕功能
Android實現頭像重疊排列功能
Android仿QQ個性標簽功能
Android仿QQ側滑刪除的功能
總結
以上是生活随笔為你收集整理的android item弹出popupwindow recycleview_Android实现RecycleView嵌套RecycleView中的item自动循环滚动功能...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript调用其他函数中的变量
- 下一篇: Matlab 实现对 Excel she