本文内容:

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如下:
将自然状态下的背景放到了最后,但点击浏览时依然没有作用。**其实最根本原因是在布局文件里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>

💬 评论