在Android开发 中,经常会要用到水平水平ListView(HorizontalListView),但是,Android 官方并没有提供这样一个控件, 所以在这里我给大家分享一下我在项目中用到的一个水平水平ListView,非常好用, 使用过程 中与 ListView 是一样的, 实例化组件, 设置数据,设置Adaper.

packagecom.example.horizontallistview.hl.widget;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.view.View;importandroid.widget.AdapterView;importandroid.widget.ListAdapter;publicabstractclassHorizontalListViewextendsAdapterView<ListAdapter>{publicHorizontalListView(Contextcontext){super(context);}publicHorizontalListView(Contextcontext,AttributeSetattrs){super(context,attrs);}publicHorizontalListView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);}publicabstractintgetScreenPositionForView(Viewview);/***Interfacedefinitionforacallbacktobeinvokedwhenaniteminthis*viewhasbeenclickedandheld.*/publicinterfaceOnItemDragListener{/***Callbackmethodtobeinvokedwhenaniteminthisviewhasbeen*draggedoutsidetheverticaltolerancearea.**ImplementerscancallgetItemAtPosition(position)iftheyneedto*accessthedataassociatedwiththeselecteditem.**@paramparent*TheAbsListViewwheretheclickhappened*@paramview*TheviewwithintheAbsListViewthatwasclicked*@paramposition*Thepositionoftheviewinthelist*@paramid*Therowidoftheitemthatwasclicked**@returntrueifthecallbackconsumedthelongclick,falseotherwise*/booleanonItemStartDrag(AdapterView<?>parent,Viewview,intposition,longid);}publicinterfaceOnLayoutChangeListener{voidonLayoutChange(booleanchanged,intleft,inttop,intright,intbottom);}publicinterfaceOnScrollFinishedListener{/***Callbackmethodtobeinvokedwhenthescrollhascompleted.**@paramcurrentX*Thecurrentscrollpositionoftheview*/voidonScrollFinished(intcurrentX);}}

为什么要继承AdapterView, 大家可以去看看Android提供的ListView是怎么实现的,

publicclassListViewextendsAbsListView
publicabstractclassAbsListViewextendsAdapterView<ListAdapter>implementsTextWatcher,ViewTreeObserver.OnGlobalLayoutListener,Filter.FilterListener,ViewTreeObserver.OnTouchModeChangeListener,RemoteViewsAdapter.RemoteAdapterConnectionCallback{

大家 对比去看看官方文档实现 ListView的类就知道了.这里我就不再多说了

大家 注意 HorizontalListView只是 一个抽象类, 所以我们不能直接用它,需要用一个类来实现里面的方法

publicclassHorizontalVariableListViewextendsHorizontalListViewimplementsOnGestureListener,FlingRunnableView{publicenumSelectionMode{Single,Multiple};publicinterfaceOnItemClickedListener{/***CallbackmethodtobeinvokedwhenaniteminthisAdapterViewhas*beenclicked.*<p>*ImplementerscancallgetItemAtPosition(position)iftheyneedto*accessthedataassociatedwiththeselecteditem.**@paramparent*TheAdapterViewwheretheclickhappened.*@paramview*TheviewwithintheAdapterViewthatwasclicked(this*willbeaviewprovidedbytheadapter)*@paramposition*Thepositionoftheviewintheadapter.*@paramid*Therowidoftheitemthatwasclicked.*@returniftheimplementationreturnfalse,thentheselectionwill*notbeupdated*/booleanonItemClick(AdapterView<?>parent,Viewview,intposition,longid);}publicstaticfinalintOVER_SCROLL_ALWAYS=0;publicstaticfinalintOVER_SCROLL_IF_CONTENT_SCROLLS=1;publicstaticfinalintOVER_SCROLL_NEVER=2;protectedstaticfinalStringLOG_TAG="horizontal-variable-list";privatestaticfinalfloatWIDTH_THRESHOLD=1.1f;protectedintmAlignMode=Gravity.CENTER;protectedSparseBooleanArraymSelectedPositions=newSparseBooleanArray();protectedintmHeight=0;protectedintmPaddingTop=0;protectedintmPaddingBottom=0;protectedListAdaptermAdapter;privateintmAdapterItemCount;privateintmLeftViewIndex=-1;privateintmRightViewIndex=0;privateGestureDetectormGesture;privateList<Queue<View>>mRecycleBin;privateList<Integer>mChildWidths=newArrayList<Integer>();privateList<Integer>mChildHeights=newArrayList<Integer>();privatebooleanmDataChanged=false;privateIFlingRunnablemFlingRunnable;privatebooleanmForceLayout;privateintmDragTolerance=0;privatebooleanmDragScrollEnabled;protectedEdgeGlowmEdgeGlowLeft,mEdgeGlowRight;privateintmOverScrollMode=OVER_SCROLL_NEVER;privateMatrixmEdgeMatrix=newMatrix();privateScrollNotifiermScrollNotifier;privateSelectionModemChoiceMode=SelectionMode.Single;privateOnItemSelectedListenermOnItemSelected;privateOnItemClickedListenermOnItemClicked;privateOnItemDragListenermItemDragListener;privateOnScrollChangedListenermScrollListener;privateOnScrollFinishedListenermScrollFinishedListener;privateOnLayoutChangeListenermLayoutChangeListener;publicvoidsetOnItemDragListener(OnItemDragListenerlistener){mItemDragListener=listener;}publicvoidsetOnScrollListener(OnScrollChangedListenerlistener){mScrollListener=listener;}publicvoidsetOnLayoutChangeListener(OnLayoutChangeListenerlistener){mLayoutChangeListener=listener;}publicvoidsetOnScrollFinishedListener(OnScrollFinishedListenerlistener){mScrollFinishedListener=listener;}publicOnItemDragListenergetOnItemDragListener(){returnmItemDragListener;}/***Controlshowselectionismanagedwithinthelist.<br/>*Singleormultipleselectionsaresupported**@seeSelectionMode*@parammode*theselectionmode*/publicvoidsetSelectionMode(SelectionModemode){mChoiceMode=mode;}/***Returnsthecurrentselectionmode**@seeSelectionMode*@return*/publicSelectionModegetChoiceMode(){returnmChoiceMode;}/***Instantiatesanewhorizontialfixedlistview.**@paramcontext*thecontext*@paramattrs*theattrs*/publicHorizontalVariableListView(Contextcontext,AttributeSetattrs){super(context,attrs);initView();}publicHorizontalVariableListView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);initView();}privatesynchronizedvoidinitView(){if(Build.VERSION.SDK_INT>8){try{mFlingRunnable=(IFlingRunnable)ReflectionUtils.newInstance("com.iotdc.android.app.shopping.HorizontalVariableListView.widget.Fling9Runnable",newClass<?>[]{FlingRunnableView.class,int.class},this,mAnimationDuration);}catch(ReflectionExceptione){mFlingRunnable=newFling8Runnable(this,mAnimationDuration);}}else{mFlingRunnable=newFling8Runnable(this,mAnimationDuration);}mLeftViewIndex=-1;mRightViewIndex=0;mMaxX=Integer.MAX_VALUE;mMinX=0;mRightEdge=0;mLeftEdge=0;mGesture=newGestureDetector(getContext(),mGestureListener);mGesture.setIsLongpressEnabled(false);setFocusable(true);setFocusableInTouchMode(true);ViewConfigurationconfiguration=ViewConfiguration.get(getContext());mTouchSlop=configuration.getScaledTouchSlop();mDragTolerance=mTouchSlop;mOverscrollDistance=10;mMaximumVelocity=configuration.getScaledMaximumFlingVelocity();mMinimumVelocity=configuration.getScaledMinimumFlingVelocity();}publicvoidsetOverScrollMode(intmode){mOverScrollMode=mode;if(mode!=OVER_SCROLL_NEVER){if(mEdgeGlowLeft==null){Drawableglow=getContext().getResources().getDrawable(R.drawable.overscroll_glow);Drawableedge=getContext().getResources().getDrawable(R.drawable.overscroll_edge);mEdgeGlowLeft=newEdgeGlow(edge,glow);mEdgeGlowRight=newEdgeGlow(edge,glow);mEdgeGlowLeft.setColorFilter(0xFF33b5e5,Mode.MULTIPLY);}}else{mEdgeGlowLeft=mEdgeGlowRight=null;}}publicvoidsetEdgeHeight(intvalue){mEdgesHeight=value;}publicvoidsetEdgeGravityY(intvalue){mEdgesGravityY=value;}@OverridepublicvoidtrackMotionScroll(intnewX){scrollTo(newX,0);mCurrentX=getScrollX();removeNonVisibleItems(mCurrentX);fillList(mCurrentX);invalidate();}@OverrideprotectedvoiddispatchDraw(Canvascanvas){super.dispatchDraw(canvas);if(getChildCount()>0){drawEdges(canvas);}}.............

当然了 , 这个类很复杂,就不把代码贴出来了, 在下面我们把这个demo代码上传的, 希望大家可以去下载,研究,然后把代码整合到自己的项目中使用.

packagecom.example.horizontallistview;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.Menu;importandroid.view.View;importandroid.widget.AdapterView;importandroid.widget.Toast;importcom.example.horizontallistview.hl.widget.HorizontalVariableListView;importcom.example.horizontallistview.hl.widget.HorizontalVariableListView.OnItemClickedListener;publicclassMainActivityextendsActivity{privateHorizontalVariableListViewlv;privateMyAdapteradapter;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv=(HorizontalVariableListView)findViewById(R.id.lv_horizontal);String[]items=newString[20];adapter=newMyAdapter(this,items);lv.setAdapter(adapter);lv.setSelectionMode(HorizontalVariableListView.SelectionMode.Single);lv.setOnItemClickedListener(newOnItemClickedListener(){@OverridepublicbooleanonItemClick(AdapterView<?>parent,Viewview,intposition,longid){//水平ListView的点击item事件Toast.makeText(MainActivity.this,position+"",1).show();returnfalse;}});}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.getMenuInflater().inflate(R.menu.main,menu);returntrue;}}

在Activity中就是这么使用这个控件就行了, 是不是很简单,与Listview是一样的用法

我再把activity_main.xml文件代码贴出来

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.example.horizontallistview.hl.widget.HorizontalVariableListViewandroid:id="@+id/lv_horizontal"android:layout_width="match_parent"android:layout_height="120dp"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:gravity="bottom|center_vertical"android:paddingBottom="0dp"android:paddingTop="0dp"/></LinearLayout>

下载demo连接:点击下载Android水平水平ListView

更多相关文章

  1. android EditText设置不可写
  2. 三、安卓UI学习(1)
  3. android 使用html5作布局文件: webview跟javascript交互
  4. android studio调试c/c++代码
  5. android用户界面之按钮(Button)教程实例汇
  6. IM-A820L限制GSM,WCDMA上网的原理(其他泛泰机型可参考)7.13
  7. 锁屏界面
  8. android(NDK+JNI)---Eclipse+CDT+gdb调试android ndk程序
  9. 在Fragment中设置控件点击方法,执行失败。

随机推荐

  1. Android(安卓)通过OKhttp3进行下载实现版
  2. Android平板电脑不能全屏显示的问题
  3. Android中xml文件读写
  4. AutoCompleteTextView的基本使用
  5. Android作为客户端,采用Netty与服务器通信
  6. 近百android开源项目贡献
  7. Android开发录音和播放音频的步骤(动态获
  8. android 问题归纳
  9. EditText 键盘收回
  10. error: resource android:attr/dialogCor