Android之监测手机网络状态的广播

今天具体说下Android检测网络状态的广播,我们在做一些手机应用的时候如果网络发生改变可能会给用户造成一些损失,在中国2G,3G网络都没有普及的情况下,基本都是包流量的,所以在做一些视频应用软件的时候,如果用户在使用WIFI的时候如果无线网络中断,手机网络会自动换手机网络,从而给用户造成不必要的损失。 Android手机在对于一些系统广播,如短信的接收,电话的接收,电池电量过低,网络状态改变都会发一个广播,既然系统会发送一条广播,那么就需要一个接收器来处理这个广播。首先定义一个类继承NetworkChangeReceiver,重写onReceive()就行了。然后在OnReceive()这个方法进行相应广播的处理。 网络状态切换的广播类: **[java]** [view plain](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)[copy](http://blog.csdn.net/lonely_fireworks/article/details/7373166#) <div> </div> </div> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">package</span> com.test; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.BroadcastReceiver; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.Intent; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.net.ConnectivityManager; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.net.NetworkInfo.State; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> BroadcastReceiver { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onReceive(Context context, Intent intent) { </span> - <span style="color: black;"> State wifiState = <span class="keyword" style="font-weight: bold; color: #006699;">null</span>; </span> - <span style="color: black;"> State mobileState = <span class="keyword" style="font-weight: bold; color: #006699;">null</span>; </span> - <span style="color: black;"> ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); </span> - <span style="color: black;"> wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); </span> - <span style="color: black;"> mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && mobileState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> </span> - <span style="color: black;"> && State.CONNECTED != wifiState </span> - <span style="color: black;"> && State.CONNECTED == mobileState) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 手机网络连接成功</span> </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && mobileState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> </span> - <span style="color: black;"> && State.CONNECTED != wifiState </span> - <span style="color: black;"> && State.CONNECTED != mobileState) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 手机没有任何的网络</span> </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && State.CONNECTED == wifiState) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 无线网络连接成功</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> 在上面这个接收类中OnReceive()方法,你可以在上面三个网络状态(只有手机网络,只有无线网络,没有任何网络)中进行相应的处理,然后在应用中注册广播,注册广播有2种方式,一种在androidmanifest.xml中注册,一种在java代码中注册。 ...

2014年7月4日 · 4 分钟 · 天边的星星

Android使用PhotoView实现图片缩放功能

使用第三方开源项目,地址:https://github.com/chrisbanes/PhotoView 引入library 项目. 简单的加载一张图片: **[java]** [view plain](http://blog.csdn.net/own_1991/article/details/12186627#)[copy](http://blog.csdn.net/own_1991/article/details/12186627#) <div> </div> </div> </div> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> MainActivity <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> Activity { </span> - <span style="color: black;"> </span> - <span style="color: black;"> ImageView imgView; </span> - <span style="color: black;"> PhotoViewAttacher attacher; </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> imgView=(ImageView) findViewById(R.id.img); </span> - <span style="color: black;"> imgView.setImageResource(R.drawable.wallpaper); </span> - <span style="color: black;"> attacher=<span class="keyword" style="font-weight: bold; color: #006699;">new</span> PhotoViewAttacher(imgView); </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> 布局文件: **[html]** [view plain](http://blog.csdn.net/own_1991/article/details/12186627#)[copy](http://blog.csdn.net/own_1991/article/details/12186627#) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">RelativeLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/tools&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">&#8220;.MainActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">ImageView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/img&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">RelativeLayout</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span>

2014年6月28日 · 2 分钟 · 天边的星星

理解Android的手势识别

对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理。不过,为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们提供的手势识别工具GestureDetector就可以帮上大忙了。 基础 GestureDetector的工作原理是,当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置侦听器获得GestureDetector处理后的手势。 GestureDetector提供了两个侦听器接口,OnGestureListener处理单击类消息,OnDoubleTapListener处理双击类消息。 OnGestureListener的接口有这几个: // 单击,触摸屏按下时立刻触发 abstract boolean onDown(MotionEvent e); // 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势) abstract boolean onSingleTapUp(MotionEvent e); // 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会 abstract void onShowPress(MotionEvent e); // 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发 abstract void onLongPress(MotionEvent e); // 滚动,触摸屏按下后移动 abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY); // 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势 abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY); OnDoubleTapListener的接口有这几个: // 双击,手指在触摸屏上迅速点击第二下时触发 abstract boolean onDoubleTap(MotionEvent e); // 双击的按下跟抬起各触发一次 abstract boolean onDoubleTapEvent(MotionEvent e); // 单击确认,即很快的按下并抬起,但并不连续点击第二下 abstract boolean onSingleTapConfirmed(MotionEvent e); ...

2014年6月28日 · 2 分钟 · 天边的星星

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

本文内容: 1、横向ListView的所有实现思路; 2、其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册; 3、实现的横向ListView在点击、浏览时item背景会变色,并解决了listview里setSelected造成item的选择状态混乱的问题。 众所周知,ListView默认的方向是垂直的,但有些时候人们更喜欢横向ListView。纵观整个网络,横向ListView的实现思路如下: 1、在布局里用HorizontalScrollView包含一个ListView,参考这里; 2、利用GridView,把它的行数设为1行; 3、有人继承ListView构造了一个HorizontalScrollListView,参见:这里 4、国外一位大牛继承AdapterView构造的HorizontalListView,这是以上所有方法里本人认为最正统的方法,本文即基于此方法,参见:这里 下面看源码: 这是Activity的布局文件:activity_main.xml **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">RelativeLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/tools&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingBottom</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_vertical_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingLeft</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_horizontal_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingRight</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_horizontal_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingTop</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_vertical_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">&#8220;.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">org.yanzi.ui.HorizontalListView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/horizon_listview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;150dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_alignParentTop</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">org.yanzi.ui.HorizontalListView</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">ImageView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/image_preview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_below</span>=<span class="attribute-value" style="color: blue;">&#8220;@id/horizon_listview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_centerInParent</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:clickable</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:background</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/selector_imageview_background&#8221;</span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="comments" style="color: #008200;"><!&#8211; android:background=&#8221;@android:drawable/ic_menu_gallery&#8221; &#8211;></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">RelativeLayout</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 这是横向listview的每个item的布局,图片+文字,horizontal_list_item.xml **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><?</span><span class="tag-name" style="font-weight: bold; color: blue;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">LinearLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingLeft</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingRight</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingTop</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingBottom</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:orientation</span>=<span class="attribute-value" style="color: blue;">&#8220;vertical&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:gravity</span>=<span class="attribute-value" style="color: blue;">&#8220;center&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:clickable</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:background</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/selector_item_background&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">ImageView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/img_list_item&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">TextView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/text_list_item&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:gravity</span>=<span class="attribute-value" style="color: blue;">&#8220;center&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">LinearLayout</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 下面文件是selector_imageview_background.xml,这是大图片你点击浏览时背景发生变化的selector,没有啥实际作用。 **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><?</span><span class="tag-name" style="font-weight: bold; color: blue;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_green_light&#8221;</span> <span class="attribute" style="color: red;">android:state_pressed</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_green_light&#8221;</span> <span class="attribute" style="color: red;">android:state_focused</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/image_background&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"><span class="comments" style="color: #008200;"><!&#8211; android:drawable=&#8221;@android:color/transparent&#8221; &#8211;></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 下面是每个item的selector,在focus和select时颜色会发生变化:selector_item_background.xml **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><?</span><span class="tag-name" style="font-weight: bold; color: blue;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_red_light&#8221;</span> <span class="attribute" style="color: red;">android:state_selected</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_green_dark&#8221;</span> <span class="attribute" style="color: red;">android:state_pressed</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/transparent&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 主程序:MainActivity.java **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.testhorizontallistview; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.ui.HorizontalListView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.ui.HorizontalListViewAdapter; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.app.Activity; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.os.Bundle; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.Menu; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.AdapterView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.AdapterView.OnItemClickListener; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ImageView; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> MainActivity <span class="keyword" style="font-weight: bold; color: blue;">extends</span> Activity { </span> - <span style="color: black;"> HorizontalListView hListView; </span> - <span style="color: black;"> HorizontalListViewAdapter hListViewAdapter; </span> - <span style="color: black;"> ImageView previewImg; </span> - <span style="color: black;"> View olderSelectView = <span class="keyword" style="font-weight: bold; color: blue;">null</span>; </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> initUI(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onCreateOptionsMenu(Menu menu) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// Inflate the menu; this adds items to the action bar if it is present.</span> </span> - <span style="color: black;"> getMenuInflater().inflate(R.menu.main, menu); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> initUI(){ </span> - <span style="color: black;"> hListView = (HorizontalListView)findViewById(R.id.horizon_listview); </span> - <span style="color: black;"> previewImg = (ImageView)findViewById(R.id.image_preview); </span> - <span style="color: black;"> String[] titles = {<span class="string" style="color: red;">&#8220;怀师&#8221;</span>, <span class="string" style="color: red;">&#8220;南怀瑾军校&#8221;</span>, <span class="string" style="color: red;">&#8220;闭关&#8221;</span>, <span class="string" style="color: red;">&#8220;南怀瑾&#8221;</span>, <span class="string" style="color: red;">&#8220;南公庄严照&#8221;</span>, <span class="string" style="color: red;">&#8220;怀师法相&#8221;</span>}; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] ids = {R.drawable.nanhuaijin_miss, R.drawable.nanhuaijin_school, </span> - <span style="color: black;"> R.drawable.nanhuaijin_biguan, R.drawable.nanhuaijin, </span> - <span style="color: black;"> R.drawable.nanhuaijin_zhuangyan, R.drawable.nanhuaijin_faxiang}; </span> - <span style="color: black;"> hListViewAdapter = <span class="keyword" style="font-weight: bold; color: blue;">new</span> HorizontalListViewAdapter(getApplicationContext(),titles,ids); </span> - <span style="color: black;"> hListView.setAdapter(hListViewAdapter); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// hListView.setOnItemSelectedListener(new OnItemSelectedListener() {</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// @Override</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// public void onItemSelected(AdapterView<?> parent, View view,</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// int position, long id) {</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// // TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// if(olderSelected != null){</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// olderSelected.setSelected(false); //上一个选中的View恢复原背景</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// olderSelected = view;</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// view.setSelected(true);</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// @Override</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// public void onNothingSelected(AdapterView<?> parent) {</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// // TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// </span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// });</span> </span> - <span style="color: black;"> hListView.setOnItemClickListener(<span class="keyword" style="font-weight: bold; color: blue;">new</span> OnItemClickListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onItemClick(AdapterView<?> parent, View view, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> position, <span class="keyword" style="font-weight: bold; color: blue;">long</span> id) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// if(olderSelectView == null){</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }else{</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView.setSelected(false);</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = null;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// view.setSelected(true);</span> </span> - <span style="color: black;"> previewImg.setImageResource(ids[position]); </span> - <span style="color: black;"> hListViewAdapter.setSelectIndex(position); </span> - <span style="color: black;"> hListViewAdapter.notifyDataSetChanged(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> - <span style="color: black;"></span> </span> HorizontalListView.java 这就是自定义的横向listview **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.ui; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">/*</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * HorizontalListView.java v1.5</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> *</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * The MIT License</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * Copyright (c) 2011 Paul Soucy (paul@dev-smart.com)</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * of this software and associated documentation files (the &#8220;Software&#8221;), to deal</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * in the Software without restriction, including without limitation the rights</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * copies of the Software, and to permit persons to whom the Software is</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * furnished to do so, subject to the following conditions:</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * The above copyright notice and this permission notice shall be included in</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * all copies or substantial portions of the Software.</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * THE SOFTWARE IS PROVIDED &#8220;AS IS&#8221;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * THE SOFTWARE.</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> *</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> */</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> java.util.LinkedList; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> java.util.Queue; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.database.DataSetObserver; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Rect; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.AttributeSet; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.GestureDetector; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.GestureDetector.OnGestureListener; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.MotionEvent; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.AdapterView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ListAdapter; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.Scroller; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> HorizontalListView <span class="keyword" style="font-weight: bold; color: blue;">extends</span> AdapterView<ListAdapter> { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> mAlwaysOverrideTouch = <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> ListAdapter mAdapter; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mLeftViewIndex = &#8211;<span class="number" style="color: #c00000;">1</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mRightViewIndex = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mCurrentX; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mNextX; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mMaxX = Integer.MAX_VALUE; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mDisplayOffset = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> Scroller mScroller; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> GestureDetector mGesture; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Queue<View> mRemovedViewQueue = <span class="keyword" style="font-weight: bold; color: blue;">new</span> LinkedList<View>(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnItemSelectedListener mOnItemSelected; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnItemClickListener mOnItemClicked; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnItemLongClickListener mOnItemLongClicked; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> mDataChanged = <span class="keyword" style="font-weight: bold; color: blue;">false</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> HorizontalListView(Context context, AttributeSet attrs) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>(context, attrs); </span> - <span style="color: black;"> initView(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> initView() { </span> - <span style="color: black;"> mLeftViewIndex = &#8211;<span class="number" style="color: #c00000;">1</span>; </span> - <span style="color: black;"> mRightViewIndex = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mDisplayOffset = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mCurrentX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mNextX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mMaxX = Integer.MAX_VALUE; </span> - <span style="color: black;"> mScroller = <span class="keyword" style="font-weight: bold; color: blue;">new</span> Scroller(getContext()); </span> - <span style="color: black;"> mGesture = <span class="keyword" style="font-weight: bold; color: blue;">new</span> GestureDetector(getContext(), mOnGesture); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) { </span> - <span style="color: black;"> mOnItemSelected = listener; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setOnItemClickListener(AdapterView.OnItemClickListener listener){ </span> - <span style="color: black;"> mOnItemClicked = listener; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) { </span> - <span style="color: black;"> mOnItemLongClicked = listener; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> DataSetObserver mDataObserver = <span class="keyword" style="font-weight: bold; color: blue;">new</span> DataSetObserver() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onChanged() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span>(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>){ </span> - <span style="color: black;"> mDataChanged = <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> invalidate(); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onInvalidated() { </span> - <span style="color: black;"> reset(); </span> - <span style="color: black;"> invalidate(); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> }; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> ListAdapter getAdapter() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> mAdapter; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> View getSelectedView() { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//TODO: implement</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">null</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setAdapter(ListAdapter adapter) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mAdapter != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> mAdapter.unregisterDataSetObserver(mDataObserver); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> mAdapter = adapter; </span> - <span style="color: black;"> mAdapter.registerDataSetObserver(mDataObserver); </span> - <span style="color: black;"> reset(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> reset(){ </span> - <span style="color: black;"> initView(); </span> - <span style="color: black;"> removeAllViewsInLayout(); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setSelection(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//TODO: implement</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> addAndMeasureChild(<span class="keyword" style="font-weight: bold; color: blue;">final</span> View child, <span class="keyword" style="font-weight: bold; color: blue;">int</span> viewPos) { </span> - <span style="color: black;"> LayoutParams params = child.getLayoutParams(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(params == <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> params = <span class="keyword" style="font-weight: bold; color: blue;">new</span> LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> addViewInLayout(child, viewPos, params, <span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), </span> - <span style="color: black;"> MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onLayout(<span class="keyword" style="font-weight: bold; color: blue;">boolean</span> changed, <span class="keyword" style="font-weight: bold; color: blue;">int</span> left, <span class="keyword" style="font-weight: bold; color: blue;">int</span> top, <span class="keyword" style="font-weight: bold; color: blue;">int</span> right, <span class="keyword" style="font-weight: bold; color: blue;">int</span> bottom) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onLayout(changed, left, top, right, bottom); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mAdapter == <span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mDataChanged){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> oldCurrentX = mCurrentX; </span> - <span style="color: black;"> initView(); </span> - <span style="color: black;"> removeAllViewsInLayout(); </span> - <span style="color: black;"> mNextX = oldCurrentX; </span> - <span style="color: black;"> mDataChanged = <span class="keyword" style="font-weight: bold; color: blue;">false</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mScroller.computeScrollOffset()){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> scrollx = mScroller.getCurrX(); </span> - <span style="color: black;"> mNextX = scrollx; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mNextX <= <span class="number" style="color: #c00000;"></span>){ </span> - <span style="color: black;"> mNextX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mScroller.forceFinished(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mNextX >= mMaxX) { </span> - <span style="color: black;"> mNextX = mMaxX; </span> - <span style="color: black;"> mScroller.forceFinished(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx = mCurrentX &#8211; mNextX; </span> - <span style="color: black;"> </span> - <span style="color: black;"> removeNonVisibleItems(dx); </span> - <span style="color: black;"> fillList(dx); </span> - <span style="color: black;"> positionItems(dx); </span> - <span style="color: black;"> </span> - <span style="color: black;"> mCurrentX = mNextX; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(!mScroller.isFinished()){ </span> - <span style="color: black;"> post(<span class="keyword" style="font-weight: bold; color: blue;">new</span> Runnable(){ </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> run() { </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> fillList(<span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> edge = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> View child = getChildAt(getChildCount()-<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> edge = child.getRight(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> fillListRight(edge, dx); </span> - <span style="color: black;"> </span> - <span style="color: black;"> edge = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> child = getChildAt(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> edge = child.getLeft(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> fillListLeft(edge, dx); </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> fillListRight(<span class="keyword" style="font-weight: bold; color: blue;">int</span> rightEdge, <span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), <span class="keyword" style="font-weight: bold; color: blue;">this</span>); </span> - <span style="color: black;"> addAndMeasureChild(child, &#8211;<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> rightEdge += child.getMeasuredWidth(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mRightViewIndex == mAdapter.getCount()-<span class="number" style="color: #c00000;">1</span>) { </span> - <span style="color: black;"> mMaxX = mCurrentX + rightEdge &#8211; getWidth(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (mMaxX < <span class="number" style="color: #c00000;"></span>) { </span> - <span style="color: black;"> mMaxX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> mRightViewIndex++; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> fillListLeft(<span class="keyword" style="font-weight: bold; color: blue;">int</span> leftEdge, <span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(leftEdge + dx > <span class="number" style="color: #c00000;"></span> && mLeftViewIndex >= <span class="number" style="color: #c00000;"></span>) { </span> - <span style="color: black;"> View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), <span class="keyword" style="font-weight: bold; color: blue;">this</span>); </span> - <span style="color: black;"> addAndMeasureChild(child, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> leftEdge -= child.getMeasuredWidth(); </span> - <span style="color: black;"> mLeftViewIndex&#8211;; </span> - <span style="color: black;"> mDisplayOffset -= child.getMeasuredWidth(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> removeNonVisibleItems(<span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> View child = getChildAt(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span> && child.getRight() + dx <= <span class="number" style="color: #c00000;"></span>) { </span> - <span style="color: black;"> mDisplayOffset += child.getMeasuredWidth(); </span> - <span style="color: black;"> mRemovedViewQueue.offer(child); </span> - <span style="color: black;"> removeViewInLayout(child); </span> - <span style="color: black;"> mLeftViewIndex++; </span> - <span style="color: black;"> child = getChildAt(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> child = getChildAt(getChildCount()-<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span> && child.getLeft() + dx >= getWidth()) { </span> - <span style="color: black;"> mRemovedViewQueue.offer(child); </span> - <span style="color: black;"> removeViewInLayout(child); </span> - <span style="color: black;"> mRightViewIndex&#8211;; </span> - <span style="color: black;"> child = getChildAt(getChildCount()-<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> positionItems(<span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(getChildCount() > <span class="number" style="color: #c00000;"></span>){ </span> - <span style="color: black;"> mDisplayOffset += dx; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> left = mDisplayOffset; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">for</span>(<span class="keyword" style="font-weight: bold; color: blue;">int</span> i=<span class="number" style="color: #c00000;"></span>;i<getChildCount();i++){ </span> - <span style="color: black;"> View child = getChildAt(i); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> childWidth = child.getMeasuredWidth(); </span> - <span style="color: black;"> child.layout(left, <span class="number" style="color: #c00000;"></span>, left + childWidth, child.getMeasuredHeight()); </span> - <span style="color: black;"> left += childWidth + child.getPaddingRight(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> scrollTo(<span class="keyword" style="font-weight: bold; color: blue;">int</span> x) { </span> - <span style="color: black;"> mScroller.startScroll(mNextX, <span class="number" style="color: #c00000;"></span>, x &#8211; mNextX, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> dispatchTouchEvent(MotionEvent ev) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> handled = <span class="keyword" style="font-weight: bold; color: blue;">super</span>.dispatchTouchEvent(ev); </span> - <span style="color: black;"> handled |= mGesture.onTouchEvent(ev); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> handled; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onFling(MotionEvent e1, MotionEvent e2, <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityX, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityY) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span>(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>){ </span> - <span style="color: black;"> mScroller.fling(mNextX, <span class="number" style="color: #c00000;"></span>, (<span class="keyword" style="font-weight: bold; color: blue;">int</span>)-velocityX, <span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>, mMaxX, <span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onDown(MotionEvent e) { </span> - <span style="color: black;"> mScroller.forceFinished(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnGestureListener mOnGesture = <span class="keyword" style="font-weight: bold; color: blue;">new</span> GestureDetector.SimpleOnGestureListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onDown(MotionEvent e) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>.onDown(e); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onFling(MotionEvent e1, MotionEvent e2, <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityX, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityY) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>.onFling(e1, e2, velocityX, velocityY); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onScroll(MotionEvent e1, MotionEvent e2, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span> distanceX, <span class="keyword" style="font-weight: bold; color: blue;">float</span> distanceY) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span>(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>){ </span> - <span style="color: black;"> mNextX += (<span class="keyword" style="font-weight: bold; color: blue;">int</span>)distanceX; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onSingleTapConfirmed(MotionEvent e) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">for</span>(<span class="keyword" style="font-weight: bold; color: blue;">int</span> i=<span class="number" style="color: #c00000;"></span>;i<getChildCount();i++){ </span> - <span style="color: black;"> View child = getChildAt(i); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (isEventWithinView(e, child)) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mOnItemClicked != <span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> mOnItemClicked.onItemClick(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, child, mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i, mAdapter.getItemId( mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i )); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mOnItemSelected != <span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> mOnItemSelected.onItemSelected(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, child, mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i, mAdapter.getItemId( mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i )); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">break</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onLongPress(MotionEvent e) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> childCount = getChildCount(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">for</span> (<span class="keyword" style="font-weight: bold; color: blue;">int</span> i = <span class="number" style="color: #c00000;"></span>; i < childCount; i++) { </span> - <span style="color: black;"> View child = getChildAt(i); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (isEventWithinView(e, child)) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (mOnItemLongClicked != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> mOnItemLongClicked.onItemLongClick(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, child, mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i, mAdapter.getItemId(mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i)); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">break</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> isEventWithinView(MotionEvent e, View child) { </span> - <span style="color: black;"> Rect viewRect = <span class="keyword" style="font-weight: bold; color: blue;">new</span> Rect(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] childPosition = <span class="keyword" style="font-weight: bold; color: blue;">new</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[<span class="number" style="color: #c00000;">2</span>]; </span> - <span style="color: black;"> child.getLocationOnScreen(childPosition); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> left = childPosition[<span class="number" style="color: #c00000;"></span>]; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> right = left + child.getWidth(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> top = childPosition[<span class="number" style="color: #c00000;">1</span>]; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> bottom = top + child.getHeight(); </span> - <span style="color: black;"> viewRect.set(left, top, right, bottom); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> viewRect.contains((<span class="keyword" style="font-weight: bold; color: blue;">int</span>) e.getRawX(), (<span class="keyword" style="font-weight: bold; color: blue;">int</span>) e.getRawY()); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }; </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> - <span style="color: black;"></span> </span> HorizontalListViewAdapter.java 横向listview的适配器,我将他单独写到一个java文件里。 **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.ui; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.testhorizontallistview.R; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.util.BitmapUtil; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Bitmap; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.drawable.Drawable; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.media.ThumbnailUtils; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.LayoutInflater; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.ViewGroup; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.BaseAdapter; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ImageView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.TextView; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> HorizontalListViewAdapter <span class="keyword" style="font-weight: bold; color: blue;">extends</span> BaseAdapter{ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] mIconIDs; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> String[] mTitles; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Context mContext; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> LayoutInflater mInflater; </span> - <span style="color: black;"> Bitmap iconBitmap; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> selectIndex = &#8211;<span class="number" style="color: #c00000;">1</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> HorizontalListViewAdapter(Context context, String[] titles, <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] ids){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mContext = context; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mIconIDs = ids; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mTitles = titles; </span> - <span style="color: black;"> mInflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);<span class="comment" style="color: #008200;">//LayoutInflater.from(mContext);</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> getCount() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> mIconIDs.length; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> Object getItem(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> position; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">long</span> getItemId(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> position; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> View getView(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position, View convertView, ViewGroup parent) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> ViewHolder holder; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(convertView==<span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> holder = <span class="keyword" style="font-weight: bold; color: blue;">new</span> ViewHolder(); </span> - <span style="color: black;"> convertView = mInflater.inflate(R.layout.horizontal_list_item, <span class="keyword" style="font-weight: bold; color: blue;">null</span>); </span> - <span style="color: black;"> holder.mImage=(ImageView)convertView.findViewById(R.id.img_list_item); </span> - <span style="color: black;"> holder.mTitle=(TextView)convertView.findViewById(R.id.text_list_item); </span> - <span style="color: black;"> convertView.setTag(holder); </span> - <span style="color: black;"> }<span class="keyword" style="font-weight: bold; color: blue;">else</span>{ </span> - <span style="color: black;"> holder=(ViewHolder)convertView.getTag(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(position == selectIndex){ </span> - <span style="color: black;"> convertView.setSelected(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> }<span class="keyword" style="font-weight: bold; color: blue;">else</span>{ </span> - <span style="color: black;"> convertView.setSelected(<span class="keyword" style="font-weight: bold; color: blue;">false</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> holder.mTitle.setText(mTitles[position]); </span> - <span style="color: black;"> iconBitmap = getPropThumnail(mIconIDs[position]); </span> - <span style="color: black;"> holder.mImage.setImageBitmap(iconBitmap); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> convertView; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">static</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> ViewHolder { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> TextView mTitle ; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> ImageView mImage; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Bitmap getPropThumnail(<span class="keyword" style="font-weight: bold; color: blue;">int</span> id){ </span> - <span style="color: black;"> Drawable d = mContext.getResources().getDrawable(id); </span> - <span style="color: black;"> Bitmap b = BitmapUtil.drawableToBitmap(d); </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// Bitmap bb = BitmapUtil.getRoundedCornerBitmap(b, 100);</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> w = mContext.getResources().getDimensionPixelOffset(R.dimen.thumnail_default_width); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> h = mContext.getResources().getDimensionPixelSize(R.dimen.thumnail_default_height); </span> - <span style="color: black;"> </span> - <span style="color: black;"> Bitmap thumBitmap = ThumbnailUtils.extractThumbnail(b, w, h); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> thumBitmap; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setSelectIndex(<span class="keyword" style="font-weight: bold; color: blue;">int</span> i){ </span> - <span style="color: black;"> selectIndex = i; </span> - <span style="color: black;"> } </span> - <span style="color: black;">}</span> </span> 下面是效果图: ![](http://img.blog.csdn.net/20140315182924656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 下图是一个item被选定后,另一个item获得了焦点: ![](http://img.blog.csdn.net/20140315183047562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 下面是横向时的截图: ![](http://img.blog.csdn.net/20140315183137906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 要点如下: 1、可以说这个HorizontalListView是完美的,但美中不足的并不是其他人说的不能点击、晃动、加载不全的问题,而是这个横向Listview的高度,如果你设成wrap_cotent那么将会占据整个屏幕,**即使你将它适配器里的view的高度限制死,限制成很小,这个HorizontalListView的高度依然是全屏**。本文代码里,我把图片缩略图弄成100dip,所以把这个HorizontalListView的高度设为了150dip。 2、在适配器里,我填充了一个图片,下面是文字。为了能让浏览图片时item有反应,搞了一个selector,它的用法详见[这里](http://blog.csdn.net/shakespeare001/article/details/7788400). 但一开始在点击时完全没有反应,参考这里: [http://blog.csdn.net/ljz2009y/article/details/18820071](http://blog.csdn.net/ljz2009y/article/details/18820071) 为此我的selector如下: <?xml version=”1.0″ encoding=”utf-8″?> 将自然状态下的背景放到了最后,但点击浏览时依然没有作用。**其实最根本原因是在布局文件里horizontal_list_item.xml要让这个布局能够clickable,即:android:clickable=”true”** 3、上一步完成了,还需要点击即select一个item时,让它变色并且保持住,然后点击另外一个item时,让之前得item恢复默认背景。为了实现这个问题,我曾作如下尝试: **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="comment" style="color: #008200;">// if(olderSelectView == null){</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }else{</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView.setSelected(false);</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = null;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// view.setSelected(true);</span></span> </span> 即在click监听里,保存上一个选中的view。遗憾的是这种方法会造成item的选中状态造成混乱,比如第一个item选中了,同时第5个item也莫名其妙的被选中了。上述情况发生在滑动时,即一屏显示不完的情况下。当我横屏时,在所有的item都能一次性显示出来情况下,用上述方法么问题。后来我想到,这可以是适配器里的缓存机制造成的,**<span style="color: #ff0000;">最好不要再listview适配器外对item作修改,即便修改则一定要调适配器的: hListViewAdapter.notifyDataSetChanged();通知刷新view,毕竟适配器才是view的提供者</span>**。参考这位大大的文章:[http://longyi-java.iteye.com/blog/976067](http://longyi-java.iteye.com/blog/976067) 在适配器里加了一个接口保存选中的索引,然后再getView函数里进行判断。如果是选中的item,则将布局设为选中状态即可,horizontal_list_item.xml里的Linearlayout就会自动加载那个selector了。而无需像这个参考链接里对每个item的元素分别设置状态。</div> <div> 4、BitmapUtil是个工具类,负责将id转成一个bitmap,然后用android自带的ThumbnailUtils去提取缩略图。 </div> <div> 5、之所以horizontal_list_item布局里要设置padding是为了选中item时,整个item有种被圈住的感觉,而不是光下面一点变色。 </div> <div> 源码下载:[http://download.csdn.net/detail/yanzi1225627/7046295](http://download.csdn.net/detail/yanzi1225627/7046295)</div> <div> 欢迎Android爱好者加群 <div id="group_name" class="group_name usrInputFont"> <span class="qname" title="Android您问我讲-2">**Android您问我讲-2,**</span> </div> **群号:**<span id="group_number" class="group_number">**19241311,备注:yanzi**</span> </div> <div> </div> <div> &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;本文系原创,转载请注明作者:yanzi1225627 </div> <div> </div> <div> </div> <div> 源码下载:[http://download.csdn.net/detail/yanzi1225627/7046295](http://download.csdn.net/detail/yanzi1225627/7046295) </div> <div> 源码下载:[http://download.csdn.net/detail/yanzi1225627/7046295](http://download.csdn.net/detail/yanzi1225627/7046295) </div>

2014年6月27日 · 37 分钟 · 天边的星星

Android代码实现长按显示波纹外扩动画

项目两张图片: wave btn 代码: package com.example.waveanimation; import Android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.animation.AlphaAnimation; import android.view.animation.AnimationSet; import android.view.animation.ScaleAnimation; import android.widget.ImageView; public class MainActivity extends Activity { private static final int ANIMATIONEACHOFFSET = 600; // 每个动画的播放时间间隔 private AnimationSet aniSet, aniSet2, aniSet3; private ImageView btn, wave1, wave2, wave3; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x222) { wave2.startAnimation(aniSet2); } else if (msg.what == 0x333) { wave3.startAnimation(aniSet3); } super.handleMessage(msg); } ...

2014年6月27日 · 2 分钟 · 天边的星星

Android 两Activity之间动画效果———翻页效果

用Android rotate动画实现翻页效果,效果如图: ![](http://img.blog.csdn.net/20130826221333046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhemFpOTYzMTg0NzA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 要实现上面动画,首先搞明白rotate动画原理; (1)Degrees坐标: 0度(360度) 270度![](http://img.blog.csdn.net/20130826214747859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhemFpOTYzMTg0NzA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 90度 顺时针旋转 180 (2)rotate 关键属性 fromDegrees 开始旋转时角度 toDegrees 结束时的角度 pivotX,pivotY 旋转时的中心点 他们范围是 0—100%p (0,0)代表左上角,(100%p, 100%p)右下角 duration 动画持续时间 毫秒为单位 知道了这两点就可以实现了 在res新建 anim 文件夹 新建 离开Activity时的xml **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><?</span><span class="tag-name" style="font-weight: bold; color: #993300;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">rotate</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:duration</span>=<span class="attribute-value" style="color: blue;">&#8220;500&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:fromDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotX</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotY</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:toDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> <span style="color: #000000;">新建 进入Activity时的xml</span> **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><?</span><span class="tag-name" style="font-weight: bold; color: #993300;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">rotate</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:duration</span>=<span class="attribute-value" style="color: blue;">&#8220;500&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:fromDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;90&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotX</span>=<span class="attribute-value" style="color: blue;">&#8220;100%p&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotY</span>=<span class="attribute-value" style="color: blue;">&#8220;100%p&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:toDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> <span style="color: #000000;">最后就是代码调用了</span> **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) - <span style="color: black;">Intent <span class="attribute" style="color: red;">intent</span> = <span class="attribute-value" style="color: blue;">new</span> Intent(ActivityAnimationDemo.this, activtyanimationdemo2.class); </span> - <span style="color: black;">startActivity(intent); </span> - <span style="color: black;">overridePendingTransition(R.anim.rotate_left, R.anim.rotate_right); </span> 解释一下应放入的参数 **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) - <span style="color: black;">overridePendingTransition(进入时的动画,离开时的动画) </span> &nbsp; [源码下载](http://download.csdn.net/detail/huazai963184709/6016175)(为了方便,把移动和 旋转动画代码写一块了)

2014年6月23日 · 3 分钟 · 天边的星星

Android 页面左右切换动画实现

<div> slide_left_in.xml <?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?> <set xmlns:android=&#8221;http://schemas.android.com/apk/res/android&#8221;> <translate android:duration=&#8221;300&#8243; android:fromXDelta=&#8221;-100.0%p&#8221; android:toXDelta=&#8221;0.0&#8243; /> </set> slide_left_out.xml <?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?> slide_right_in.xml <?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?> slide_right_out.xml <?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?> </div> <div> </div> <div> 1. 在Style文件里面定义 </div> </div> 2.在Manifest里面application设置Theme android:theme=”@style/AppTheme” ...

2014年6月23日 · 1 分钟 · 天边的星星

Android开发者必知的5个开源库

过去的时间里,Android开发逐步走向成熟,一个个与Android相关的开发工具也层出不穷。不过,在面对各种新鲜事物时,不要忘了那些我们每天使用的大量开源库。在这里,向大家介绍的就是,在这个任劳任怨的大家庭中,最受开发者喜爱的五个Android库。希望通过对它们的了解,能够对你的开发工作有所帮助。 ** ** 1. GSON Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可用于将Java对象转换成对应的JSON表示,也可以将JSON字符串转换成一个等效的Java对象。如果与API打交道的话,那么这将会是你经常需要的东西。我们主要使用JSON的原因就是,相较XML,轻量级的JSON要简单的多。 **[js]** [view plain](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[copy](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/394286)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/394286/fork) <div> </div> </div> - <span style="color: #000000;"><span class="comment" style="color: #008200;">// Serialize </span> </span> - <span style="color: #000000;">String userJSON = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Gson().toJson(user); </span> - <span style="color: #000000;"> </span> - <span style="color: #000000;"><span class="comment" style="color: #008200;">// Deserialize</span> </span> - <span style="color: #000000;">User user = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Gson().fromJson(userJSON, User.<span class="keyword" style="font-weight: bold; color: #006699;">class</span>); </span> 2. RETROFIT ...

2014年6月20日 · 6 分钟 · 天边的星星

MVP模式与MVC模式

源地址:http://www.cnblogs.com/cuihongyu3503319/archive/2009/01/09/1372820.html [MVP模式与MVC模式(转)](http://www.cnblogs.com/cuihongyu3503319/archive/2009/01/09/1372820.html) MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。Alex在他的blog中对于这两者之间的比较很直观也比较清楚,原文可以下面的地址找到:[http://ameleta.spaces.live.com/blog/cns!5F6316345A821420!163.entry](http://ameleta.spaces.live.com/blog/cns!5F6316345A821420!163.entry)【译文】: **Model View Presenter vs Model View Controller** **简介** 在我工作中经常需要处理一些由于开发人员没能很清楚地理解MVC和MVP模式的区别的情况下使用它们而产生的问题。在这篇文章中我将会阐述一下我对两者之间区别的一些理解。 在N层体系结构中MVC/P模式仅仅只是用于表示层(presentation layer),理解这一点很重要。这两个模式并不是关于怎么构建数据层(data layer)和服务层(service layer)的,而是关于怎么将数据(data)从用户接口(view)中分离出来,以及用户接口如何与数据进行交互的。这些模式的使用让解除你的程序中表示层对对数据和控制逻辑的依赖,从而可以自由的变更表示层。 这两种模式的一般性概念 1、模型(Model)表示数据模型和业务逻辑(business logic)。模型并不总是DataSet,DataTable之类的东西,它代表着一类组件(components)或类(class),这些组件或类可以向外部提供数据,同时也能从外部获取数据并将这些数据存储在某个地方。简单的理解,可以把模型想象成“外观类(facade class)”。译注:这里的外观是指“外观模式”中所说的外观。外观的一般作用是为一个复杂的子系统提供高层次的简单易用的访问接口,可以参看下面的图来理解它的原理: ![](http://images.cnblogs.com/cnblogs_com/chen-cxb/1.jpg) 2、视图(View)将数据层现给用户。一般的视图都只是包含用户界面(UI),而不包含界面逻辑。比如,Asp.net中包含控件的页面(page)就是一个视图。视图可以从模型中读取数据,但是不能修改或更新模型。 3、层现器(Presenter)/控制器(Controller)包含了根据用户在视图中的行为去更新模型的逻辑。视图仅仅只是将用户的行为告知控制器,而控制器负责从视图中取得数据然后发送给模型。 **MVC/P模式的核心是为了将模型从视图/控制器中分离出来,从而使得模型独立于它们,因此模型不包含对视图和控制的引用。 什么是MVC(Model View Presenter)模式?** 1、为了使得视图接口可以与模型和控制器进行交互,控制器执行一些初始化事件 2、用户通过视图(用户接口)执行一些操作 3、控制器处理用户行为(可以用观察着模式实现)并通知模型进行更新 4、模型引发一些事件,以便将改变发告知视图 5、视图处理模型变更的事件,然后显示新的模型数据 6、用户接口等待用户的进一步操作 这一模式的有一下几个要点: 1、视图并不使用控制器去更新模型。控制器负责处理从视图发送过来的用户操作并通过与模型的交互进行数据的更新 2、控制器可以和视图融合在一块。Visual Studion中对Windows Forms的默认处理方式就是这样的。【译注:比如我们双击一个Button,然后在它的事件里写处理逻辑,然后将处理的数据写回模型中。这里处理逻辑时间应该是控制器的功能,但是我们并没有专门写一个控制器来做这件事情而是接受了VS的默认处理方式,将它写在Form的代码中,而这里的Form在MVC中它就是一个View。所以这说vs默认的处理方式是将把控制器和视图融合在一起的。】 3、控制器不包含对视图的渲染逻辑(rendering logic) **“主动—MVC”模式**,也是通常意义下的MVC模式 &nbsp; <div align="center"> ![](http://images.cnblogs.com/cnblogs_com/chen-cxb/2.jpg) </div> &nbsp; &nbsp; 【译注:为什么说是主动的?View不是等Controller通知它Model更新了然后才从Model取数据并更新显示,而是自己监视Model的更新(如果用观察者模式)或主动询问Model是否更新。前面那种等待Controller通知的方式是下面所介绍的“被动—MVC”的实现方式。】 **“被动—MVC”模式** 与主动MVC的区别在于: 1、模型对视图和控制器一无所知,它仅仅是被它们使用 2、控制器使用视图,并通知它更新数据显示 3、视图仅仅是在控制器通知它去模型取数据的时候它才这么做(视图并不会订阅或监视模型的更新) 4、控制器负责处理模型数据的变化 5、控制器可以包含对视图的渲染逻辑 ...

2014年6月20日 · 1 分钟 · 天边的星星

Android上传附件方法,直接复制可以用

Android上传附件方法,直接复制可以用 // 附件上传 public static String post(String actionUrl, String fileName) throws IOException { // 产生随机分割内容 String BOUNDARY = java.util.UUID.randomUUID().toString(); String MULTIPART_FROM_DATA = “multipart/from-data”; String CHARSET = “UTF-8”; // 定义URL实例 URL uri = new URL(actionUrl); // 定义HttpURLConnection实例,打开连接 HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); // 设置从主机读取数据超时(单位:毫秒) conn.setReadTimeout(5 * 1000); // 设置允许输入 conn.setDoInput(true); // 设置允许输出 conn.setDoOutput(true); // 设置不允许使用缓存 conn.setUseCaches(false); // 设置为POST发送方法 conn.setRequestMethod(“POST”); // 设置维持长连接 conn.setRequestProperty(“connection”, “keep-alive”); // 设置文件字符集编码 conn.setRequestProperty(“Charset”, “UTF-8”); // 设置文件类型 conn.setRequestProperty(“Content-Type”, MULTIPART_FROM_DATA ...

2014年6月13日 · 2 分钟 · 天边的星星