Android横向ListView.docx
- 文档编号:16771311
- 上传时间:2023-07-17
- 格式:DOCX
- 页数:50
- 大小:251.07KB
Android横向ListView.docx
《Android横向ListView.docx》由会员分享,可在线阅读,更多相关《Android横向ListView.docx(50页珍藏版)》请在冰点文库上搜索。
Android横向ListView
Android横向ListView
在日常开发中经常会发现横向的ListView。
下面讨论实现方案。
1.动态的添加布局。
RelativeLayoutview=(RelativeLayout)LayoutInflater.from(this)
.inflate(R.layout.demo,null);
ListView.addView(view);
2.通过继承AdapterView(ListAdapter)自定义类实现
部分关键代码如下:
类名:
HorizontalListView(这个类不是我实现的,我只是拿来用)
布局代码
android: id="@+id/listview" android: layout_width="wrap_content" android: layout_height="240dp" android: clipToPadding="true" android: paddingLeft="12dp" app: dividerWidth="35dp" /> 代码粘贴如下: packagecom.homelink.newlink.view; importandroid.annotation.SuppressLint; importandroid.annotation.TargetApi; importandroid.content.Context; importandroid.content.res.TypedArray; importandroid.database.DataSetObserver; importandroid.graphics.Canvas; importandroid.graphics.Rect; importandroid.graphics.drawable.Drawable; importandroid.os.Build; importandroid.os.Bundle; importandroid.os.Parcelable; importandroid.support.v4.view.ViewCompat; importandroid.support.v4.widget.EdgeEffectCompat; importandroid.util.AttributeSet; importandroid.view.GestureDetector; importandroid.view.HapticFeedbackConstants; importandroid.view.MotionEvent; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.AdapterView; importandroid.widget.ListAdapter; importandroid.widget.ListView; importandroid.widget.ScrollView; importandroid.widget.Scroller; importcom.homelink.newlink.R; importmon.utils.device.DensityUtil; importjava.util.ArrayList; importjava.util.LinkedList; importjava.util.List; importjava.util.Queue; /** *Createdbyjouon2017/1/4. */ publicclassHorizontalListViewextendsAdapterView /** *DefineswheretoinsertitemsintotheViewGroup,asdefinedin{@codeViewGroup *#addViewInLayout(View,int,LayoutParams,boolean)} */ privatestaticfinalintINSERT_AT_END_OF_LIST=-1; privatestaticfinalintINSERT_AT_START_OF_LIST=0; /**Thevelocitytouseforoverscrollabsorption*/ privatestaticfinalfloatFLING_DEFAULT_ABSORB_VELOCITY=30f; /**Thefrictionamounttousefortheflingtracker*/ privatestaticfinalfloatFLING_FRICTION=0.009f; /** *UsedfortrackingthestatedatanecessarytorestoretheHorizontalListViewtoitsprevious *stateafterarotationoccurs */ privatestaticfinalStringBUNDLE_ID_CURRENT_X="BUNDLE_ID_CURRENT_X"; /** *Thebundleidoftheparentsstate.Usedtorestoretheparent'sstateafterarotation *occurs */ privatestaticfinalStringBUNDLE_ID_PARENT_STATE="BUNDLE_ID_PARENT_STATE"; /**Tracksongoingflings*/ protectedScrollermFlingTracker=newScroller(getContext()); /**Gesturelistenertoreceivecallbackswhengesturesaredetected*/ privatefinalGestureListenermGestureListener=newGestureListener(); /**Usedfordetectinggestureswithinthisviewsotheycanbehandled*/ privateGestureDetectormGestureDetector; /**Thistracksthestartinglayoutpositionoftheleftmostview*/ privateintmDisplayOffset; /**Holdsareferencetotheadapterboundtothisview*/ protectedListAdaptermAdapter; /**Holdsacacheofrecycledviewstobereusedasneeded*/ privateList /**Flagusedtomarkwhentheadaptersdatahaschanged,sotheviewcanberelaidout*/ privatebooleanmDataChanged=false; /**Temporaryrectangletobeusedformeasurements*/ privateRectmRect=newRect(); /**Tracksthecurrentlytouchedview,usedtodelegatetouchestotheviewbeingtouched*/ privateViewmViewBeingTouched=null; /**Thewidthofthedividerthatwillbeusedbetweenlistitems*/ privateintmDividerWidth=0; /**Thedrawablethatwillbeusedasthelistdivider*/ privateDrawablemDivider=null; /**Thexpositionofthecurrentlyrenderedview*/ protectedintmCurrentX; /**Thexpositionofthenexttoberenderedview*/ protectedintmNextX; /**Usedtoholdthescrollpositiontorestoretopostrotate*/ privateIntegermRestoreX=null; /** *TracksthemaximumpossibleXposition,staysatmaxvalueuntillastitemislaidoutandit *canbedetermined */ privateintmMaxX=Integer.MAX_VALUE; /**Theadapterindexoftheleftmostviewcurrentlyvisible*/ privateintmLeftViewAdapterIndex; /**Theadapterindexoftherightmostviewcurrentlyvisible*/ privateintmRightViewAdapterIndex; /**Thistracksthecurrentlyselectedaccessibilityitem*/ privateintmCurrentlySelectedAdapterIndex; /** *Callbackinterfacetonotifylistenerthattheuserhasscrolledthisviewtothepointthat *itislowondata. */ privateRunningOutOfDataListenermRunningOutOfDataListener=null; /** *Thistrackstheuservaluesetofhowmanyitemsfromtheendwillbeconsideredrunningout *ofdata. */ privateintmRunningOutOfDataThreshold=0; /** *Tracksifwehavetoldthelistenerthatwearerunninglowondata.Weonlywanttotell *themonce. */ privatebooleanmHasNotifiedRunningLowOnData=false; /** *Callbackinterfacetobeinvokedwhenthescrollstatehaschanged. */ privateOnScrollStateChangedListenermOnScrollStateChangedListener=null; /** *Representsthecurrentscrollstateofthisview.Neededsowecandetectwhenthestate *changessoscrolllistenercanbenotified. */ privateOnScrollStateChangedListener.ScrollStatemCurrentScrollState= OnScrollStateChangedListener.ScrollState.SCROLL_STATE_IDLE; /** *Tracksthestateoftheleftedgeglow. */ privateEdgeEffectCompatmEdgeGlowLeft; /** *Tracksthestateoftherightedgeglow. */ privateEdgeEffectCompatmEdgeGlowRight; /**Theheightmeasurespecforthisview,usedtohelpsizechildrenviews*/ privateintmHeightMeasureSpec; /**Usedtotrackifaviewtouchshouldbeblockedbecauseitstoppedafling*/ privatebooleanmBlockTouchAction=false; /** *Usedtotrackiftheparentverticallyscrollableviewhasbeentoldto *DisallowInterceptTouchEvent */ privatebooleanmIsParentVerticiallyScrollableViewDisallowingInterceptTouchEvent=false; /** *Thelistenerthatreceivesnotificationswhenthisviewisclicked. */ privateOnClickListenermOnClickListener; /** *Recodethepositionofpressandloose */ privateMotionEventmPressEvent; privateMotionEventmLooseEvent; /** *MaoDianmode */ privatebooleanmIsAnchorEnable; /** *Filingmode */ privatebooleanmIsFilingEnable=true; publicHorizontalListView(Contextcontext,AttributeSetattrs){ super(context,attrs); mEdgeGlowLeft=newEdgeEffectCompat(context); mEdgeGlowRight=newEdgeEffectCompat(context); mGestureDetector=newGestureDetector(context,mGestureListener); bindGestureDetector(); initView(); retrieveXmlConfiguration(context,attrs); setWillNotDraw(false); //IftheOSversionishighenoughthensetthefrictionontheflingtracker*/ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){ HoneycombPlus.setFriction(mFlingTracker,FLING_FRICTION); } } /**Registersthegesturedetectortoreceivegesturenotificationsforthisview*/ privatevoidbindGestureDetector(){ //Generictouchlistenerthatcanbeappliedtoanyviewthatneedstoprocessgestures finalOnTouchListenergestureListenerHandler=newOnTouchListener(){ @OverridepublicbooleanonTouch(finalViewv,finalMotionEventevent){ //Delegatethetoucheventtoourgesturedetector returnmGestureDetector.onTouchEvent(event); } }; setOnTouchListener(gestureListenerHandler); } /** *WhenthisHorizontalListViewisembeddedwithinaverticalscrollingviewitisimportantto *disabletheparentviewfrominteractingwith *anytoucheventswhiletheuserisscrollingwithinthisHorizontalListView.Thiswillstart *atthisviewandgouptheviewtreelooking *foraverticalscrollingview.Ifoneisfounditwillenableordisableparenttouch *interception. * *@paramdisallowInterceptIftruetheparentwillbepreventedfrominterceptingchildtouch *events */ privatevoidrequestParentListViewToNotInterceptTouchEvents(BooleandisallowIntercept){ //Preventcallingthismorethanonceneedlessly if(mIsParentVerticiallyScrollableViewDisallowingInterceptTouchEvent! =disallowIntercept){ Viewview=this; while(view.getParent()instanceofView){ //IftheparentisaListVieworScrollViewthendisallowinterceptingoftouchevents if(view.getParent()instanceofListView||view.getParent()instanceofScrollView){ view.getParent().requestDisallowInterceptTouchEvent(disallowIntercept); mIsParentVerticiallyScrollableViewDisallowingInterceptTouchEvent=disallowIntercept; return; } view=(View)view.getParent(); } } } /** *ParsetheXMLconfigurationforthiswidget * *@paramcontextContextusedforextractingattributes *@paramattrsTheAttributeSetcontainingtheColumnViewattributes */ privatevoidretrieveXmlConfiguration(Contextcontext,AttributeSetattrs){ if(attrs! =null){ TypedArraya=context.obtainStyledAttributes(attrs,R.styleable.HorizontalListView); //GettheprovideddrawablefromtheXML finalDrawabled=a.getDrawable(R.styleable.HorizontalListView_android_divider); if(d! =null){ //Ifadrawableisprovidedtouseasthedividerthenuseitsintrinsicwidthforthedividerwidth setDivider(d); } //Ifawidthisexplicitlyspecifiedthenusethatwidth finalintdividerWidth= a.getDimensionPixelSize(R.styleable.HorizontalListView_dividerWidth,0); if(dividerWidth! =0){ setDividerWidth(dividerWidth); } a.recycle(); } } @OverridepublicParcelableonSaveInstanceState(){ Bundlebundle=n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 横向 ListView