安卓弹性view2
来源:互联网 发布:淘宝直通车官网申请 编辑:程序博客网 时间:2024/06/06 01:07
说明:上一篇只是理论性质的文章,在实用方面存在很大的局限性
这篇解决问题有:
1.item显示不全问题
2.对外暴露刷新和加载更多
刷新容器:
public class PullToRefresh extends FrameLayout { // 滚动时间 private static final long ANIM_TIME = 400; //原始位置 private int startL, startR, startT, startB; //恢复位置阶段 private boolean isMoved = false; //阻尼 private static final float zuni = 0.8f; //View private View view; private float oldY; private boolean isRefresh=false; private boolean isLoadMore=false; private boolean isOK=true; private OnRefreshListener onRefreshListener; public PullToRefresh(Context context) { super(context); } public PullToRefresh(Context context, AttributeSet attrs) { super(context, attrs); } public PullToRefresh(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //关闭右侧滚动条 this.setVerticalScrollBarEnabled(false); } public void setOnRefreshListener(OnRefreshListener onRefreshListener){ this.onRefreshListener=onRefreshListener; } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (getChildCount() == 1) { view = getChildAt(0); startL = view.getLeft(); startR = view.getRight(); startT = view.getTop(); startB = view.getBottom(); } else if (getChildCount() > 1) { throw new RuntimeException("只能有一个子View"); } else if (getChildCount() < 1) { throw new RuntimeException("没有子View"); } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (view == null) { return super.dispatchTouchEvent(ev); } boolean isTouchOutOfScrollView = ev.getY() >= startB || ev.getY() <= startT; //如果当前view的Y上的位置 if (isTouchOutOfScrollView) {//如果不在view的范围内 if (isMoved) {//当前容器已经被移动 recoverContainer(); } return true; } switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: //记录按下时的Y oldY = ev.getY(); case MotionEvent.ACTION_MOVE: float newY = ev.getY(); int scrollY = (int) (newY - oldY); if (downLicense() && scrollY > 0){ isRefresh=true; }else{ isRefresh=false; } if (upLicense()&& scrollY < 0){ isLoadMore=true; }else{ isLoadMore=false; } if (isRefresh ||isLoadMore) { int offset = (int) (scrollY * zuni); view.layout(startL, startT + offset, startR, startB + offset); isMoved = true; return true; } else { oldY = newY; isMoved = false; recoverContainer(); return super.dispatchTouchEvent(ev); } case MotionEvent.ACTION_UP: if (isMoved) { recoverContainer(); return true; } } return super.dispatchTouchEvent(ev); } /** * 位置还原 */ private void recoverContainer() { if (!isMoved) { return; } if(isOK){ isOK=false; if(isRefresh&&(!isLoadMore)){ onRefreshListener.refresh(); }else if(isLoadMore&&(!isRefresh)){ onRefreshListener.loadmore(); } } TranslateAnimation anims = new TranslateAnimation(0, 0, view.getTop(), startT); anims.setDuration(ANIM_TIME); view.startAnimation(anims); view.layout(startL, startT, startR, startB); isMoved = false; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return false; } public boolean downLicense() { if (view instanceof RecyclerView) { RecyclerView rv = (RecyclerView) view; RecyclerView.Adapter adapter = rv.getAdapter(); int firstVisibleItemCount = ((LinearLayoutManager) (rv.getLayoutManager())).findFirstVisibleItemPosition(); if (firstVisibleItemCount == 0 && adapter.getItemCount() > 0&& rv.getChildAt(0).getY() == 0) { return true; } else { return false; } } return true; } public boolean upLicense() { if (view instanceof RecyclerView) { RecyclerView rv = (RecyclerView) view; LinearLayoutManager manager = (LinearLayoutManager) rv.getLayoutManager(); //获取最后一个完全显示的ItemPosition int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition(); int totalItemCount = manager.getItemCount(); if (lastVisibleItem == (totalItemCount - 1)){ return true; } else { return false; } } return true; } public void refreshComplete(){ isOK=true; }}
使用方法:
1.xml中
<com.shiying.mutualwin.customer.PullToRefresh android:id="@+id/pulltorefresh" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_goods" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView></com.shiying.mutualwin.customer.PullToRefresh>
2.activity中
pulltorefresh.setOnRefreshListener(new OnRefreshListener() { @Override public void refresh() { page=1; getGoodsList(0,1); } @Override public void loadmore() { page++; getGoodsList(1,2); }});public interface OnRefreshListener { public void refresh(); public void loadmore();}
阅读全文
0 0
- 安卓弹性view2
- 安卓弹性View
- 安卓开发进阶之弹性布局FlexboxLayout--Part1(翻译)
- 安卓开发进阶之弹性布局FlexboxLayout--Part2(翻译)
- 安卓开发进阶之弹性布局FlexboxLayout--Part3(翻译)
- 自定义View2
- 自定义view2
- Table+view2
- 安卓弹性刷新通用版—支持任何view上下刷新均有弹性效果
- 安卓弹性刷新通用版—支持任何view上下刷新均有弹性效果
- 安卓弹性刷新通用版—支持任何view上下刷新均有弹性效果
- 弹性
- android 自定义View2 笔记
- android 如何绘制view2
- android自定义View2--SurfaceView
- android 自定义view2
- 自定义View2 刮刮卡效果
- android自定义view2
- Java实现账号密码登录窗口(包含修改密码等)
- 开发手记--记录常用第三方包compile添加依赖方法以及基础使用
- 2017.07.12回顾 python mysql decimal case when漏掉一种情况 mysql字符串参与算术运算
- 前端-判断浏览器类型
- 控件移到前面
- 安卓弹性view2
- HihoCoder
- [Stetho]chrome打开inspect时出现一片空白
- jxl 导出的表格,字符串太长,导致显示不全
- EventBus---简单使用
- 读书须当少年时
- [WIFI] AP硬件知识- PHY/Radio Card/MAC
- roaringbitmap 源代码分析
- 不会用到索引的sql