本文内容: 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#)[](https://code.csdn.net/snippets/237690)[](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;">“font-family: ‘Comic Sans MS’; font-size: 18px;”</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;">“http://schemas.android.com/apk/res/android”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">“http://schemas.android.com/tools”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">“match_parent”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">“match_parent”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingBottom</span>=<span class="attribute-value" style="color: blue;">“@dimen/activity_vertical_margin”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingLeft</span>=<span class="attribute-value" style="color: blue;">“@dimen/activity_horizontal_margin”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingRight</span>=<span class="attribute-value" style="color: blue;">“@dimen/activity_horizontal_margin”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingTop</span>=<span class="attribute-value" style="color: blue;">“@dimen/activity_vertical_margin”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">“.MainActivity”</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;">“@+id/horizon_listview”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">“match_parent”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">“150dip”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_alignParentTop</span>=<span class="attribute-value" style="color: blue;">“true”</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;">“@+id/image_preview”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">“wrap_content”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">“wrap_content”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_below</span>=<span class="attribute-value" style="color: blue;">“@id/horizon_listview”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_centerInParent</span>=<span class="attribute-value" style="color: blue;">“true”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:clickable</span>=<span class="attribute-value" style="color: blue;">“true”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:background</span>=<span class="attribute-value" style="color: blue;">“@drawable/selector_imageview_background”</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;"><!– android:background=”@android:drawable/ic_menu_gallery” –></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#)[](https://code.csdn.net/snippets/237690)[](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;">“font-family: ‘Comic Sans MS’; font-size: 18px;”</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;">“1.0”</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">“utf-8”</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;">“http://schemas.android.com/apk/res/android”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">“wrap_content”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">“wrap_content”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingLeft</span>=<span class="attribute-value" style="color: blue;">“2dip”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingRight</span>=<span class="attribute-value" style="color: blue;">“2dip”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingTop</span>=<span class="attribute-value" style="color: blue;">“2dip”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingBottom</span>=<span class="attribute-value" style="color: blue;">“2dip”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:orientation</span>=<span class="attribute-value" style="color: blue;">“vertical”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:gravity</span>=<span class="attribute-value" style="color: blue;">“center”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:clickable</span>=<span class="attribute-value" style="color: blue;">“true”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:background</span>=<span class="attribute-value" style="color: blue;">“@drawable/selector_item_background”</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;">“@+id/img_list_item”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">“wrap_content”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">“wrap_content”</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;">“@+id/text_list_item”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">“match_parent”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">“wrap_content”</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:gravity</span>=<span class="attribute-value" style="color: blue;">“center”</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#)[](https://code.csdn.net/snippets/237690)[](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;">“font-family: ‘Comic Sans MS’; font-size: 18px;”</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;">“1.0”</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">“utf-8”</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;">“http://schemas.android.com/apk/res/android”</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;">“@android:color/holo_green_light”</span> <span class="attribute" style="color: red;">android:state_pressed</span>=<span class="attribute-value" style="color: blue;">“true”</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;">“@android:color/holo_green_light”</span> <span class="attribute" style="color: red;">android:state_focused</span>=<span class="attribute-value" style="color: blue;">“true”</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;">“@drawable/image_background”</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;"><!– android:drawable=”@android:color/transparent” –></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#)[](https://code.csdn.net/snippets/237690)[](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;">“font-family: ‘Comic Sans MS’; font-size: 18px;”</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;">“1.0”</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">“utf-8”</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;">“http://schemas.android.com/apk/res/android”</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;">“@android:color/holo_red_light”</span> <span class="attribute" style="color: red;">android:state_selected</span>=<span class="attribute-value" style="color: blue;">“true”</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;">“@android:color/holo_green_dark”</span> <span class="attribute" style="color: red;">android:state_pressed</span>=<span class="attribute-value" style="color: blue;">“true”</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;">“@android:color/transparent”</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#)[](https://code.csdn.net/snippets/237690)[](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">“font-family: ‘Comic Sans MS’; font-size: 18px;”</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;">“怀师”</span>, <span class="string" style="color: red;">“南怀瑾军校”</span>, <span class="string" style="color: red;">“闭关”</span>, <span class="string" style="color: red;">“南怀瑾”</span>, <span class="string" style="color: red;">“南公庄严照”</span>, <span class="string" style="color: red;">“怀师法相”</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#)[](https://code.csdn.net/snippets/237690)[](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">“font-family: ‘Comic Sans MS’; font-size: 18px;”</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 “Software”), 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 “AS IS”, 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 = –<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 = –<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 – 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, –<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 – 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–; </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–; </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 – 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#)[](https://code.csdn.net/snippets/237690)[](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">“font-family: ‘Comic Sans MS’; font-size: 18px;”</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 = –<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> 下面是效果图:  下图是一个item被选定后,另一个item获得了焦点:  下面是横向时的截图:  要点如下: 1、可以说这个HorizontalListView是完美的,但美中不足的并不是其他人说的不能点击、晃动、加载不全的问题,而是这个横向Listview的高度,如果你设成wrap_cotent那么将会占据整个屏幕,**即使你将它适配器里的view的高度限制死,限制成很小,这个HorizontalListView的高度依然是全屏**。本文代码里,我把图片缩略图弄成100dip,所以把这个HorizontalListView的高度设为了150dip。 2、在适配器里,我填充了一个图片,下面是文字。为了能让浏览图片时item有反应,搞了一个selector,它的用法详见[这里](http://blog.csdn.net/shakespeare001/article/details/7788400). 但一开始在点击时完全没有反应,参考这里: [http://blog.csdn.net/ljz2009y/article/details/18820071](http://blog.csdn.net/ljz2009y/article/details/18820071) 为此我的selector如下: <?xml version=”1.0″ encoding=”utf-8″?> 将自然状态下的背景放到了最后,但点击浏览时依然没有作用。**其实最根本原因是在布局文件里horizontal_list_item.xml要让这个布局能够clickable,即:android:clickable=”true”** 3、上一步完成了,还需要点击即select一个item时,让它变色并且保持住,然后点击另外一个item时,让之前得item恢复默认背景。为了实现这个问题,我曾作如下尝试: **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[](https://code.csdn.net/snippets/237690)[](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">“font-family: ‘Comic Sans MS’; font-size: 18px;”</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> ———————————本文系原创,转载请注明作者: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>