横向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
原创粉丝点击