横向ListView
来源:互联网 发布:王克勤记者知乎 编辑:程序博客网 时间:2024/05/16 07:09
介可不是什么ScrollView哦,android系统自带的ListView都是竖着的,这个是横着的,自定义的ListView001package com.zhangyu.activity;002 importjava.util.LinkedList;003 importjava.util.Queue;004 importandroid.content.Context;005 importandroid.database.DataSetObserver;006 importandroid.graphics.Rect;007 importandroid.util.AttributeSet;008import android.util.Log;009 importandroid.view.GestureDetector;010 importandroid.view.GestureDetector.OnGestureListener;011 importandroid.view.MotionEvent;012 importandroid.view.View;013 importandroid.widget.AdapterView;014 importandroid.widget.ListAdapter;015import android.widget.Scroller;016 publicclass HorizontialListView extends AdapterView<ListAdapter> {017 publicboolean mAlwaysOverrideTouch = true;018 protectedListAdapter mAdapter; 019 privateint mLeftViewIndex = -1; 020 privateint mRightViewIndex = 0; 021 protectedint mCurrentX; 022 protectedint mNextX; 023 privateint mMaxX = Integer.MAX_VALUE;024 privateint mDisplayOffset = 0; 025 protectedScroller mScroller; 026 privateGestureDetector mGesture; 027 privateQueue<View> mRemovedViewQueue = newLinkedList<View>();028 privateOnItemSelectedListener mOnItemSelected; 029 privateOnItemClickListener mOnItemClicked; 030 privateOnItemLongClickListener mOnItemLongClicked; 031 privateboolean mDataChanged = false; 032 publicHorizontialListView(Context context, AttributeSet attrs) {033 super(context, attrs); 034 initView(); 035 036 }037 privatesynchronized void initView() {038 mLeftViewIndex = -1;039 mRightViewIndex =0;040 mDisplayOffset =0;041 mCurrentX =0;042 mNextX =0; 043 mMaxX = Integer.MAX_VALUE;044 mScroller =new Scroller(getContext());045 mGesture =new GestureDetector(getContext(), mOnGesture);046 047 }048 @Override049 publicvoid setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) {050 mOnItemSelected = listener; 051 052 } 053 @Override 054 publicvoid setOnItemClickListener(AdapterView.OnItemClickListener listener){055 mOnItemClicked = listener;056 057 } 058 @Override 059 publicvoid setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) {060 mOnItemLongClicked = listener;061 062 } 063 privateDataSetObserver mDataObserver = newDataSetObserver() {064 @Override 065 publicvoid onChanged() {066 synchronized(HorizontialListView.this){067 mDataChanged =true; 068 069 } 070 invalidate();071 requestLayout(); 072 073 } 074 @Override075 publicvoid onInvalidated() {076 reset(); 077 invalidate();078 requestLayout();079 080 } 081 082 };083 @Override 084 publicListAdapter getAdapter() {085 returnmAdapter; 086 087 } 088 @Override089 publicView getSelectedView() {090 //TODO: implement 091 092 returnnull; 093 094 } 095 @Override 096 publicvoid setAdapter(ListAdapter adapter) {097 if(mAdapter !=null) {098 mAdapter.unregisterDataSetObserver(mDataObserver);099 100 } 101 mAdapter = adapter;102 mAdapter.registerDataSetObserver(mDataObserver);103 reset();104 105 }106 privatesynchronized void reset(){107 initView();108 removeAllViewsInLayout(); 109 requestLayout(); 110 111 }112 @Override113 publicvoid setSelection(intposition) {114 //TODO: implement 115 }116 privatevoid addAndMeasureChild(finalView child, int viewPos) {117 LayoutParams params = child.getLayoutParams();118 if(params ==null) {119 params =new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);120 }121 addViewInLayout(child, viewPos, params,true);122 child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),123 MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); 124 125 }126 @Override 127 protectedsynchronized void onLayout(boolean changed,int left, inttop, int right, int bottom) {128 super.onLayout(changed, left, top, right, bottom);129 if(mAdapter ==null){130 return; 131 132 } 133 if(mDataChanged){134 intoldCurrentX = mCurrentX;135 initView();136 removeAllViewsInLayout();137 mNextX = oldCurrentX;138 mDataChanged =false;139 140 } 141 if(mScroller.computeScrollOffset()){142 intscrollx = mScroller.getCurrX();143 mNextX = scrollx;144 145 } 146 if(mNextX <=0){147 mNextX =0;148 mScroller.forceFinished(true);149 150 } 151 if(mNextX >= mMaxX) {152 mNextX = mMaxX;153 mScroller.forceFinished(true);154 155 } 156 intdx = mCurrentX - mNextX;157 removeNonVisibleItems(dx);158 fillList(dx);159 positionItems(dx);160 mCurrentX = mNextX;161 if(!mScroller.isFinished()){162 post(newRunnable(){163 @Override164 publicvoid run() {165 requestLayout();166 167 } 168 169 });170 }171 } 172 privatevoid fillList(finalint dx) {173 intedge = 0;174 View child = getChildAt(getChildCount()-1);175 if(child !=null) {176 edge = child.getRight();177 178 } 179 fillListRight(edge, dx);180 edge =0;181 child = getChildAt(0);182 if(child !=null) {183 edge = child.getLeft();184 185 } 186 fillListLeft(edge, dx); 187 188 } 189 privatevoid fillListRight(intrightEdge, final int dx) {190 while(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) {191 View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(),this);192 addAndMeasureChild(child, -1);193 rightEdge += child.getMeasuredWidth();194 if(mRightViewIndex == mAdapter.getCount()-1) {195 mMaxX = mCurrentX + rightEdge - getWidth();196 197 } 198 if(mMaxX < 0) {199 mMaxX =0;200 201 } 202 mRightViewIndex++;203 204 } 205 206 } 207 privatevoid fillListLeft(intleftEdge, final int dx) {208 while(leftEdge + dx >0 && mLeftViewIndex >= 0) {209 View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(),this);210 addAndMeasureChild(child,0);211 leftEdge -= child.getMeasuredWidth(); 212 mLeftViewIndex--; 213 mDisplayOffset -= child.getMeasuredWidth();214 215 } 216 217 } 218 219 privatevoid removeNonVisibleItems(finalint dx) {220 View child = getChildAt(0);221 while(child !=null && child.getRight() + dx <=0) {222 mDisplayOffset += child.getMeasuredWidth();223 mRemovedViewQueue.offer(child);224 removeViewInLayout(child);225 mLeftViewIndex++;226 child = getChildAt(0);227 228 } 229 child = getChildAt(getChildCount()-1);230 while(child !=null && child.getLeft() + dx >= getWidth()) {231 mRemovedViewQueue.offer(child);232 removeViewInLayout(child);233 mRightViewIndex--;234 child = getChildAt(getChildCount()-1);235 236 } 237 238 }239 privatevoid positionItems(finalint dx) {240 if(getChildCount() >0){ 241 mDisplayOffset += dx; 242 intleft = mDisplayOffset; 243 for(inti=0;i<getChildCount();i++){244 View child = getChildAt(i);245 intchildWidth = child.getMeasuredWidth();246 child.layout(left,0, left + childWidth, child.getMeasuredHeight());247 left += childWidth + child.getPaddingRight(); 248 249 } 250 251 } 252 253 } 254 publicsynchronized void scrollTo(int x) {255 mScroller.startScroll(mNextX,0, x - mNextX, 0);256 requestLayout(); 257 258 } 259 @Override260 publicboolean dispatchTouchEvent(MotionEvent ev) {261 booleanhandled = super.dispatchTouchEvent(ev);262 handled |= mGesture.onTouchEvent(ev);263 returnhandled;264 265 } 266 protectedboolean onFling(MotionEvent e1, MotionEvent e2,float velocityX,267 floatvelocityY) {268 synchronized(HorizontialListView.this){269 mScroller.fling(mNextX,0, (int)-velocityX,0, 0, mMaxX,0, 0);270 271 } 272 requestLayout();273 274 returntrue; 275 276 }277 protectedboolean onDown(MotionEvent e) {278 mScroller.forceFinished(true);279 returntrue; 280 281 } 282 privateOnGestureListener mOnGesture = newGestureDetector.SimpleOnGestureListener() {283 @Override 284 285 publicboolean onDown(MotionEvent e) {286 Log.i("lkl","ondown@@@@@@");287 returnHorizontialListView.this.onDown(e);288 } 289 @Override290 publicboolean onFling(MotionEvent e1, MotionEvent e2,float velocityX,291 floatvelocityY) {292 Log.i("lkl","onFling@@@@@@");293 returnHorizontialListView.this.onFling(e1, e2, velocityX, velocityY);294 295 } 296 @Override297 publicboolean onScroll(MotionEvent e1, MotionEvent e2,298 floatdistanceX, float distanceY) {299 Log.i("lkl","onscroll@@@@@@");300 synchronized(HorizontialListView.this){ 301 mNextX += (int)distanceX; 302 303 } 304 requestLayout(); 305 returntrue;306 307 } 308 @Override309 publicboolean onSingleTapConfirmed(MotionEvent e) {310 Log.i("lkl","onSingletapConfrimed@@@@@@");311 for(inti=0;i<getChildCount();i++){312 View child = getChildAt(i);313 314 if(isEventWithinView(e, child)) {315 if(mOnItemClicked !=null){316 mOnItemClicked.onItemClick(HorizontialListView.this, child, mLeftViewIndex +1 + i, mAdapter.getItemId( mLeftViewIndex +1 + i ));317 318 } 319 320 if(mOnItemSelected !=null){ 321 mOnItemSelected.onItemSelected(HorizontialListView.this, child, mLeftViewIndex +1 + i, mAdapter.getItemId( mLeftViewIndex +1 + i ));322 323 } 324 325 break;326 327 } 328 329 } 330 331 returntrue;332 333 } 334 @Override 335 publicvoid onLongPress(MotionEvent e) {336 intchildCount = getChildCount();337 for(int i = 0; i < childCount; i++) { 338 View child = getChildAt(i); 339 if(isEventWithinView(e, child)) {340 if(mOnItemLongClicked != null) { 341 mOnItemLongClicked.onItemLongClick(HorizontialListView.this, child, mLeftViewIndex +1 + i, mAdapter.getItemId(mLeftViewIndex +1 + i));342 343 } 344 345 break;346 347 } 348 349 } 350 351 } 352 privateboolean isEventWithinView(MotionEvent e, View child) {353 Rect viewRect =new Rect(); 354 int[] childPosition =new int[2]; 355 child.getLocationOnScreen(childPosition); 356 intleft = childPosition[0]; 357 intright = left + child.getWidth(); 358 inttop = childPosition[1];359 intbottom = top + child.getHeight(); 360 viewRect.set(left, top, right, bottom);361 returnviewRect.contains((int) e.getRawX(), (int) e.getRawY());362 363 } 364 365 };366 367}上面这段代码是自定义的ListView下面看一下adapter01package com.zhangyu.activity;0203import android.app.Activity;04import android.os.Bundle;05import android.view.LayoutInflater;06import android.view.View;07import android.view.ViewGroup;08import android.widget.BaseAdapter;09import android.widget.TextView;1011public classHorizontalListViewDemo extendsActivity {1213 @Override14 protectedvoid onCreate(Bundle savedInstanceState) {15 super.onCreate(savedInstanceState);16 17 setContentView(R.layout.main);18 19 HorizontialListView listview = (HorizontialListView) findViewById(R.id.listview);20 listview.setAdapter(mAdapter);21 22 }23 24 privatestatic String[] dataObjects = new String[]{ "Text #1",25 "Text #2",26 "Text #3"};27 28 privateBaseAdapter mAdapter = newBaseAdapter() {2930 @Override31 publicint getCount() {32 returndataObjects.length;33 }3435 @Override36 publicObject getItem(int position) {37 returnnull;38 }3940 @Override41 publiclong getItemId(intposition) {424445 @Override46 publicView getView(int position, View convertView, ViewGroup parent) {47 View retval = LayoutInflater.from(parent.getContext()).inflate(R.layout.viewitem,null);48 TextView title = (TextView) retval.findViewById(R.id.title);49 title.setText(dataObjects[position]);50 51 returnretval;52 }53 54 };55 5657 5859}
0 0
- 横向ListView
- ListView横向
- 横向listview
- 横向listview
- ListView横向
- 横向ListView中嵌套ListView
- 横向移动ListView
- Android--Listview横向滑动
- HorizontalListView 横向listview
- 横向listview源码.
- ListView横向滑动
- 横向的ListView
- 横向滑动的 ListView
- 横向滚动的ListView
- android listview 横向滚动
- 自定义横向的ListView
- listView横向滑动
- 横向滑动的listview
- 2013.12.15
- sql语句之join
- VC 设置开机自动运行
- WMI--Windows API--ConnectServer
- php检测数组长度的函数sizeof count
- 横向ListView
- eclpise使用笔记
- 最大公约数&最小公倍数探讨
- php常用的函数
- javascript之jQuery ajax 操作
- 【开源推荐】AllJoyn:打造全球物联网的通用开源框架
- Struts2中的OGNL详解
- Page 42, 自立题五
- #define