乍看很唬人,细分很简单。
首先,如果仅实现右下角的4向滚动,在HorizontalScrollView中嵌个ListView即可。就没必要看下文了。
技术点
:ListView联动、HorizontalScrollView联动。
于是乎,如果能将这些参数抓出来,再进行同步就可以了。本例使用的是接口的形式,创建HSV后,指定一个接口IUseYYY,这个接口有useXXX功能,在HSV的onScrollChanged中调用这个接口的useXXX把滚动数据传人,而这个IUseYYY恰好就是Activity。so,在Aty里同时能拿到2各HSV的滚动数据。
关键代码
重写HorizontalScrollView
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/** * onScrollChanged,内置的滚动监听功能,重写的<br/> * @param l : 新位置x <br/> * @param t : 新位置y <br/> * @param oldl : 原位置x <br/> * @param oldt : 原位置y <br/> */ @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (scrollChangedListener != null) { scrollChangedListener.onScrollChanged(this, l, t, oldl, oldt); } } /** * <b>功能</b>:setOnScrollChangedListener,为滚动控件指定一个滚动监听器,手动添加的 <br/> * <b>创建</b>:2015年12月17日,下午1:25:02 <br/> * * @param scrollChangedListener 监听器 */ public void setOnScrollChangedListener(ScrollChangedListener scrollChangedListener){ this.scrollChangedListener = scrollChangedListener; } |
监听接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/** * <b>类名</b>: ScrollChangedListener,滚动控件的监听器 <br/> * <b>说明</b>: 用于自定义的 UHorizontalScrollView <br/> * <b>创建</b>: 2015年12月17日 下午1:31:05 <br/> */ public interface ScrollChangedListener { /** * <b>功能</b>:onScrollChanged,执行监听 <br/> * <b>创建</b>:2015年12月17日,下午1:31:26 * @param view 滚动控件 <br/> * @param l 左新位置 <br/> * @param t 顶新位置 <br/> * @param oldl 左原位置 <br/> * @param oldt 顶原位置 <br/> * cuiweiyou.com */ public void onScrollChanged(UHorizontalScrollView view, int l, int t, int oldl, int oldt); } |
xml注册
和一般控件没两样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<com.cuiweiyou.allsidesscrolllistview.UHorizontalScrollView android:id="@+id/hsv1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="8" android:background="#339966" android:scrollbars="horizontal" > <TextView style="?android:attr/dropDownItemStyle" android:textAppearance="?android:attr/textAppearanceLargePopupMenu" android:singleLine="true" android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:ellipsize="marquee" android:gravity="center" android:text="1234567890098765yhnujm" /> </com.cuiweiyou.allsidesscrolllistview.UHorizontalScrollView> |
ListView同步使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
mlv1 = (ListView) findViewById(R.id.lv1); mlv2 = (ListView) findViewById(R.id.lv2); mlv1.setAdapter(adapter1); mlv2.setAdapter(adapter2); mlv1.setOnScrollListener(new OnScrollListener() { /** * onScrollStateChanged,滚动状态改变<br/> * * @param view :mListView <br/> * @param scrollState :状态码,0-停止;1-正在滚动;2-手指离开屏幕 <br/> * @see android.widget.AbsListView.OnScrollListener#onScrollStateChanged(android.widget.AbsListView, int) */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { View subview1 = mlv1.getChildAt(0); if (null == subview1) return; View subview2 = mlv2.getChildAt(0); if (null == subview2) return; int top1 = subview1.getTop(); int top2 = subview2.getTop(); final int position = mlv1.getFirstVisiblePosition();// 最顶item索引 // 如果两个首个显示的子view高度不等 if (top1 != top2) { mlv2.setSelectionFromTop(position, top1); } } /** * onScroll,滚动过程中持续调用,监听数据的方法<br/> * * @param view :mListView <br/> * @param firstVisibleItem :当前屏幕上可以看到的最顶部第一个条目的索引。始于0 <br/> * @param visibleItemCount :当前屏幕上可以看到的全部条目数量 <br/> * @param totalItemCount : mListView内拥有的全部条目数量。 <br/> * @see android.widget.AbsListView.OnScrollListener#onScroll(android.widget.AbsListView, int, int, int) */ @Override public void onScroll(AbsListView view, final int firstVisibleItem, int visibleItemCount, int totalItemCount) { View subview1 = mlv1.getChildAt(0); if (null == subview1) return; View subview2 = mlv2.getChildAt(0); if (null == subview2) return; int top1 = subview1.getTop(); int top2 = subview2.getTop(); if (top1 != top2) { mlv2.setSelectionFromTop(firstVisibleItem, top1); mlv1.setSelectionFromTop(firstVisibleItem, top1); } } }); mlv2.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { View subview1 = mlv1.getChildAt(0); if (null == subview1) return; View subview2 = mlv2.getChildAt(0); if (null == subview2) return; int top1 = subview1.getTop(); int top2 = subview2.getTop(); final int position = mlv2.getFirstVisiblePosition();// 最顶item索引 // 如果两个首个显示的子view高度不等 if (top1 != top2) { mlv1.setSelectionFromTop(position, top2); } } @Override public void onScroll(AbsListView view, final int firstVisibleItem, int visibleItemCount, int totalItemCount) { View subview1 = mlv1.getChildAt(0); if (null == subview1) return; View subview2 = mlv2.getChildAt(0); if (null == subview2) return; int top1 = subview1.getTop(); int top2 = subview2.getTop(); if (top1 != top2) { mlv2.setSelectionFromTop(firstVisibleItem, top2); mlv1.setSelectionFromTop(firstVisibleItem, top2); } } }); |
HSV同步使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
mhsv1 = (UHorizontalScrollView) findViewById(R.id.hsv1); mhsv2 = (UHorizontalScrollView) findViewById(R.id.hsv2); mhsv1.setOnScrollChangedListener(this); // 本Activity实现HSV的滚动监听 mhsv2.setOnScrollChangedListener(this); } /** * onScrollChanged,水平滚动控件滚动监听<br/> * @param view 触发此监听的滚动控件<br/> * @param l 左新<br/> * @param t 顶新<br/> * @param oldl 左旧<br/> * @param oldt : 顶旧<br/> * @see com.cuiweiyou.autoscrolllist.ScrollChangedListener#onScrollChanged(com.cuiweiyou.autoscrolllist.UHorizontalScrollView, int, int, int, int) */ @Override public void onScrollChanged(UHorizontalScrollView view, int l, int t, int oldl, int oldt) { if (view == mhsv1) { mhsv2.scrollTo(l, t); } else if (view == mhsv2) { mhsv1.scrollTo(l, t); } } |
开源地址:http://git.oschina.net/ivigiles/AllSidesScrollListView
声明
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/1773.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设