亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > 建站經驗 > 正文

Andro、id中實現水平滑動(橫向滑動)ListView示例

2019-11-02 14:27:01
字體:
來源:轉載
供稿:網友

   這篇文章主要介紹了Android中實現水平滑動(橫向滑動)ListView示例,本文用自己封裝一個控件的方法解決了這個需求,需要的朋友可以參考下

  水平的ListView-HorizontalListView的使用

  Android中ListView默認的是豎直方向的滑動,由于項目的需求,需要ListView是水平滑動的。有很多的方式可以實現,但是比較好的一種方式就是自己封裝一個控件,使用方式和ListView的使用方式是一樣的。需要完善的地方:獲取到的圖片大小沒有處理。在界面上展示的是圖片的原大小。為了更好的展示效果,應該壓縮成統一的尺寸。

  HorizontalListView.java 代碼如下:

  ?

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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
世界近代史[www.9-39.com/html/world/]
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 /** * 橫向的ListView * * * @author scd * */ public class HorizontalListView extends AdapterView<ListAdapter> {   public boolean mAlwaysOverrideTouch = true; protected ListAdapter mAdapter; private int mLeftViewIndex = -1; private int mRightViewIndex = 0; protected int mCurrentX; protected int mNextX; private int mMaxX = Integer.MAX_VALUE; private int mDisplayOffset = 0; protected Scroller mScroller; private GestureDetector mGesture; private Queue<View> mRemovedViewQueue = new LinkedList<View>(); private OnItemSelectedListener mOnItemSelected; private OnItemClickListener mOnItemClicked; private OnItemLongClickListener mOnItemLongClicked; private boolean mDataChanged = false;   public HorizontalListView(Context context, AttributeSet attrs) { super(context, attrs); initView(); }   private synchronized void initView() { mLeftViewIndex = -1; mRightViewIndex = 0; mDisplayOffset = 0; mCurrentX = 0; mNextX = 0; mMaxX = Integer.MAX_VALUE; mScroller = new Scroller(getContext()); mGesture = new GestureDetector(getContext(), mOnGesture); }   @Override public void setOnItemSelectedListener( AdapterView.OnItemSelectedListener listener) { mOnItemSelected = listener; }   @Override public void setOnItemClickListener(AdapterView.OnItemClickListener listener) { mOnItemClicked = listener; }   @Override public void setOnItemLongClickListener( AdapterView.OnItemLongClickListener listener) { mOnItemLongClicked = listener; }   private DataSetObserver mDataObserver = new DataSetObserver() {   @Override public void onChanged() { synchronized (HorizontalListView.this) { mDataChanged = true; } invalidate(); requestLayout(); }   @Override public void onInvalidated() { reset(); invalidate(); requestLayout(); }   };   @Override public ListAdapter getAdapter() { return mAdapter; }   @Override public View getSelectedView() { // TODO: implement return null; }   @Override public void setAdapter(ListAdapter adapter) { if (mAdapter != null) { mAdapter.unregisterDataSetObserver(mDataObserver); } mAdapter = adapter; mAdapter.registerDataSetObserver(mDataObserver); reset(); }   private synchronized void reset() { initView(); removeAllViewsInLayout(); requestLayout(); }   @Override public void setSelection(int position) { // TODO: implement }   private void addAndMeasureChild(final View child, int viewPos) { LayoutParams params = child.getLayoutParams(); if (params == null) { params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); }   addViewInLayout(child, viewPos, params, true); child.measure( MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); }   @Override protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom);   if (mAdapter == null) { return; }   if (mDataChanged) { int oldCurrentX = mCurrentX; initView(); removeAllViewsInLayout(); mNextX = oldCurrentX; mDataChanged = false; }   if (mScroller.computeScrollOffset()) { int scrollx = mScroller.getCurrX(); mNextX = scrollx; }   if (mNextX <= 0) { mNextX = 0; mScroller.forceFinished(true); } if (mNextX >= mMaxX) { mNextX = mMaxX; mScroller.forceFinished(true); }   int dx = mCurrentX - mNextX;   removeNonVisibleItems(dx); fillList(dx); positionItems(dx);   mCurrentX = mNextX;   if (!mScroller.isFinished()) { post(new Runnable() { @Override public void run() { requestLayout(); } });   } }   private void fillList(final int dx) { int edge = 0; View child = getChildAt(getChildCount() - 1); if (child != null) { edge = child.getRight(); } fillListRight(edge, dx);   edge = 0; child = getChildAt(0); if (child != null) { edge = child.getLeft(); } fillListLeft(edge, dx);   }   private void fillListRight(int rightEdge, final int dx) { while (rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) {   View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this); addAndMeasureChild(child, -1); rightEdge += child.getMeasuredWidth();   if (mRightViewIndex == mAdapter.getCount() - 1) { mMaxX = mCurrentX + rightEdge - getWidth(); }   if (mMaxX < 0) { mMaxX = 0; } mRightViewIndex++; }   }   private void fillListLeft(int leftEdge, final int dx) { while (leftEdge + dx > 0 && mLeftViewIndex >= 0) { View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this); addAndMeasureChild(child, 0); leftEdge -= child.getMeasuredWidth(); mLeftViewIndex--; mDisplayOffset -= child.getMeasuredWidth(); } }   private void removeNonVisibleItems(final int dx) { View child = getChildAt(0); while (child != null && child.getRight() + dx <= 0) { mDisplayOffset += child.getMeasuredWidth(); mRemovedViewQueue.offer(child); removeViewInLayout(child); mLeftViewIndex++; child = getChildAt(0);   }   child = getChildAt(getChildCount() - 1); while (child != null && child.getLeft() + dx >= getWidth()) { mRemovedViewQueue.offer(child); removeViewInLayout(child); mRightViewIndex--; child = getChildAt(getChildCount() - 1); } }   private void positionItems(final int dx) { if (getChildCount() > 0) { mDisplayOffset += dx; int left = mDisplayOffset; for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); int childWidth = child.getMeasuredWidth(); child.layout(left, 0, left + childWidth, child.getMeasuredHeight()); left += childWidth + child.getPaddingRight(); } } }   public synchronized void scrollTo(int x) { mScroller.startScroll(mNextX, 0, x - mNextX, 0); requestLayout(); }   @Override public boolean dispatchTouchEvent(MotionEvent ev) { boolean handled = super.dispatchTouchEvent(ev); handled |= mGesture.onTouchEvent(ev); return handled; }   protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { synchronized (HorizontalListView.this) { mScroller.fling(mNextX, 0, (int) -velocityX, 0, 0, mMaxX, 0, 0); } requestLayout();   return true; }   protected boolean onDown(MotionEvent e) { mScroller.forceFinished(true); return true; }   private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() {   @Override public boolean onDown(MotionEvent e) { return HorizontalListView.this.onDown(e); }   @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return HorizontalListView.this .onFling(e1, e2, velocityX, velocityY); }   @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {   synchronized (HorizontalListView.this) { mNextX += (int) distanceX; } requestLayout();   return true; }   @Override public boolean onSingleTapConfirmed(MotionEvent e) { for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); if (isEventWithinView(e, child)) { if (mOnItemClicked != null) { mOnItemClicked.onItemClick(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i)); } if (mOnItemSelected != null) { mOnItemSelected.onItemSelected(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i)); } break; }   } return true; }   @Override public void onLongPress(MotionEvent e) { int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); if (isEventWithinView(e, child)) { if (mOnItemLongClicked != null) { mOnItemLongClicked.onItemLongClick( HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i)); } break; } } }   private boolean isEventWithinView(MotionEvent e, View child) { Rect viewRect = new Rect(); int[] childPosition = new int[2]; child.getLocationOnScreen(childPosition); int left = childPosition[0]; int right = left + child.getWidth(); int top = childPosition[1]; int bottom = top + child.getHeight(); viewRect.set(left, top, right, bottom); return viewRect.contains((int) e.getRawX(), (int) e.getRawY()); } };   }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
黑人巨大精品欧美一区二区| 美女精品视频一区| 成人黄色免费看| 精品中文字幕久久久久久| 亚洲欧美国产va在线影院| 69影院欧美专区视频| 日韩国产欧美区| 国产欧美日韩精品丝袜高跟鞋| 国内久久久精品| 亚洲性生活视频| 欧美壮男野外gaytube| 日韩精品一二三四区| 成人久久久久久| 国产精品色午夜在线观看| 亚洲欧美国产精品| 欧美情侣性视频| 日韩在线观看成人| 欧美久久精品午夜青青大伊人| 81精品国产乱码久久久久久| 7m精品福利视频导航| 日本不卡视频在线播放| 国产成人av在线| 欧美视频中文字幕在线| 久久国产精品99国产精| 日韩成人黄色av| 亚洲一级黄色av| 日韩成人中文字幕| 日韩美女免费观看| 日韩电影免费在线观看| www.99久久热国产日韩欧美.com| 日韩美女视频在线观看| 97高清免费视频| 久热精品视频在线免费观看| 日本sm极度另类视频| 中文字幕亚洲综合久久| 亚洲天堂色网站| 97热在线精品视频在线观看| 91牛牛免费视频| 国产精品香蕉av| 欧美在线www| 国色天香2019中文字幕在线观看| 亚洲国产精品电影在线观看| 色婷婷av一区二区三区在线观看| 日韩欧美国产视频| 成人免费午夜电影| 欧美丰满少妇xxxx| 亚洲成人久久久久| 亚洲一区av在线播放| 在线日韩日本国产亚洲| 欧美另类99xxxxx| 亚洲男人天堂久| 日韩电影视频免费| 一本色道久久综合狠狠躁篇的优点| 国产人妖伪娘一区91| 91豆花精品一区| 欧美性高潮在线| 欧美在线视频一二三| 精品偷拍一区二区三区在线看| 精品综合久久久久久97| 久久久国产精彩视频美女艺术照福利| 精品调教chinesegay| 黑人巨大精品欧美一区二区一视频| 欧美专区在线视频| 精品久久久国产| 一区二区三区高清国产| 精品国产一区二区三区久久| 中文字幕一区二区三区电影| 欧美精品在线播放| 久久久久中文字幕2018| 亚洲午夜久久久久久久| 97超级碰碰人国产在线观看| 日韩成人小视频| 91免费人成网站在线观看18| 亚洲成人av在线播放| 成人福利在线视频| 欧美激情国产日韩精品一区18| 亚洲最大中文字幕| 欧美亚洲国产日韩2020| 欧美高清一级大片| 欧美洲成人男女午夜视频| 日韩在线视频网站| 欧美极品美女视频网站在线观看免费| 在线观看国产成人av片| 日本乱人伦a精品| 亚洲人a成www在线影院| 国产精品久久一区| 插插插亚洲综合网| 亚洲区在线播放| 成人在线精品视频| 亚洲激情在线观看视频免费| 日本久久久久久| 一区二区三区精品99久久| 亚洲最大成人在线| 欧美亚洲成人网| 亚洲欧美国产日韩天堂区| 国产亚洲xxx| 欧美在线视频免费播放| 日韩欧美在线字幕| 91精品国产91久久久久| 久久久久久久久电影| 国语自产精品视频在线看抢先版图片| 国产a∨精品一区二区三区不卡| 欧美一级大片视频| 欧美自拍大量在线观看| 久久久精品久久久| 91在线视频精品| 亚洲精品视频中文字幕| 最近2019中文字幕一页二页| 啪一啪鲁一鲁2019在线视频| 欧美日韩国产丝袜美女| 国产日本欧美一区二区三区| 国产精品久久久久久久久久99| 欧美wwwwww| 91探花福利精品国产自产在线| 91精品久久久久久久久久| 成人免费看吃奶视频网站| 91av网站在线播放| 日韩中文字在线| 欧美亚洲免费电影| 午夜欧美大片免费观看| 欧美大学生性色视频| 国产激情综合五月久久| 国产精品久久久久高潮| 国产亚洲精品久久久| 欧洲日韩成人av| 欧美激情第三页| 亚洲欧美成人精品| 国产v综合v亚洲欧美久久| 日本一区二区三区在线播放| 69视频在线播放| 人人爽久久涩噜噜噜网站| 日本精品久久久| 国产日韩精品在线| 5278欧美一区二区三区| 91久久精品日日躁夜夜躁国产| 国产精品激情av电影在线观看| 欧美日韩精品在线观看| 日韩精品丝袜在线| 国产精品黄色影片导航在线观看| 97婷婷涩涩精品一区| 欧美精品xxx| 亚洲性日韩精品一区二区| 成人欧美一区二区三区黑人孕妇| 91沈先生在线观看| 欧美丰满老妇厨房牲生活| 亚洲一区国产精品| 亚洲精品一二区| 最新69国产成人精品视频免费| 疯狂欧美牲乱大交777| 91午夜在线播放| 欧美综合国产精品久久丁香| 97视频在线观看播放| 日韩欧美国产免费播放| 精品久久久久久国产91| 日韩风俗一区 二区| 久久久亚洲网站| 国产欧美日韩丝袜精品一区| 欧美激情亚洲视频| 欧美成人在线影院| 国产精品白丝av嫩草影院| 午夜精品一区二区三区在线| 国产乱肥老妇国产一区二| 国产99久久精品一区二区永久免费| 日韩精品在线免费播放|