在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]代码实现ColorStateList及StateListDrawable
  2. Android 界面开发---控件事件监听器、按键处理
  3. Eclipse中跟踪调试Android Framework源代码
  4. 我的android 第5天 - 常见控件使用
  5. ProgressBar控件的使用(Android设置条形,环形进度条)
  6. Android实现EditText控件禁止输入内容的方法(附测试demo)
  7. Android Studio 手动创建活动(Activity) 第一行代码 第二章
  8. Android刮刮卡效果实现代码

随机推荐

  1. 系统去掉 Android(安卓)4.4.2 的StatusBa
  2. Android(安卓)Studio使用Gradle构建和发
  3. 解析Android中使用自定义字体的实现方法
  4. Android学习笔记---第五天---基础UI组件-
  5. android中textview常见属性设置
  6. Android(安卓)Wifi的工作流程
  7. Google Analytics Advanced Configuratio
  8. android中如何取得用户手机的常用联系人(
  9. Android(安卓)Native Crash的log分析和定
  10. android 音乐播放器中播放模式的设计