当前位置:首页 > 芯闻号 > 充电吧
[导读]本文内容:1、横向ListView的所有实现思路;2、其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册;3、实现的横向ListView在点击、浏览

本文内容:

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

下面看源码: 这是Activity的布局文件:activity_main.xml
[html] view plaincopyprint?  

这是横向listview的每个item的布局,图片+文字,horizontal_list_item.xml [html] view plaincopyprint?  
下面文件是selector_imageview_background.xml,这是大图片你点击浏览时背景发生变化的selector,没有啥实际作用。 [html] view plaincopyprint?  
下面是每个item的selector,在focus和select时颜色会发生变化:selector_item_background.xml [html] view plaincopyprint?  
主程序:MainActivity.java
[java] view plaincopyprint?package org.yanzi.testhorizontallistview;    import org.yanzi.ui.HorizontalListView;  import org.yanzi.ui.HorizontalListViewAdapter;    import android.app.Activity;  import android.os.Bundle;  import android.view.Menu;  import android.view.View;  import android.widget.AdapterView;  import android.widget.AdapterView.OnItemClickListener;  import android.widget.ImageView;    public class MainActivity extends Activity {      HorizontalListView hListView;      HorizontalListViewAdapter hListViewAdapter;      ImageView previewImg;      View olderSelectView = null;      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          initUI();      }        @Override      public boolean onCreateOptionsMenu(Menu menu) {          // Inflate the menu; this adds items to the action bar if it is present.          getMenuInflater().inflate(R.menu.main, menu);          return true;      }      public void initUI(){          hListView = (HorizontalListView)findViewById(R.id.horizon_listview);          previewImg = (ImageView)findViewById(R.id.image_preview);          String[] titles = {"怀师", "南怀瑾军校", "闭关", "南怀瑾", "南公庄严照", "怀师法相"};          final int[] ids = {R.drawable.nanhuaijin_miss, R.drawable.nanhuaijin_school,                  R.drawable.nanhuaijin_biguan, R.drawable.nanhuaijin,                  R.drawable.nanhuaijin_zhuangyan, R.drawable.nanhuaijin_faxiang};          hListViewAdapter = new HorizontalListViewAdapter(getApplicationContext(),titles,ids);          hListView.setAdapter(hListViewAdapter);          //      hListView.setOnItemSelectedListener(new OnItemSelectedListener() {          //          //          @Override          //          public void onItemSelected(AdapterView  
HorizontalListView.java 这就是自定义的横向listview
[java] view plaincopyprint?package org.yanzi.ui;    /*  * HorizontalListView.java v1.5  *  *   * The MIT License  * Copyright (c) 2011 Paul Soucy (paul@dev-smart.com)  *   * Permission is hereby granted, free of charge, to any person obtaining a copy  * of this software and associated documentation files (the "Software"), to deal  * in the Software without restriction, including without limitation the rights  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  * copies of the Software, and to permit persons to whom the Software is  * furnished to do so, subject to the following conditions:  *   * The above copyright notice and this permission notice shall be included in  * all copies or substantial portions of the Software.  *   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  * THE SOFTWARE.  *  */      import java.util.LinkedList;  import java.util.Queue;    import android.content.Context;  import android.database.DataSetObserver;  import android.graphics.Rect;  import android.util.AttributeSet;  import android.view.GestureDetector;  import android.view.GestureDetector.OnGestureListener;  import android.view.MotionEvent;  import android.view.View;  import android.widget.AdapterView;  import android.widget.ListAdapter;  import android.widget.Scroller;    public class HorizontalListView extends AdapterView  
HorizontalListViewAdapter.java 横向listview的适配器,我将他单独写到一个java文件里。
[java] view plaincopyprint?package org.yanzi.ui;    import org.yanzi.testhorizontallistview.R;  import org.yanzi.util.BitmapUtil;    import android.content.Context;  import android.graphics.Bitmap;  import android.graphics.drawable.Drawable;  import android.media.ThumbnailUtils;  import android.view.LayoutInflater;  import android.view.View;  import android.view.ViewGroup;  import android.widget.BaseAdapter;  import android.widget.ImageView;  import android.widget.TextView;    public class HorizontalListViewAdapter extends BaseAdapter{      private int[] mIconIDs;      private String[] mTitles;      private Context mContext;      private LayoutInflater mInflater;      Bitmap iconBitmap;      private int selectIndex = -1;        public HorizontalListViewAdapter(Context context, String[] titles, int[] ids){          this.mContext = context;          this.mIconIDs = ids;          this.mTitles = titles;          mInflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//LayoutInflater.from(mContext);      }      @Override      public int getCount() {          return mIconIDs.length;      }      @Override      public Object getItem(int position) {          return position;      }        @Override      public long getItemId(int position) {          return position;      }        @Override      public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder holder;          if(convertView==null){              holder = new ViewHolder();              convertView = mInflater.inflate(R.layout.horizontal_list_item, null);              holder.mImage=(ImageView)convertView.findViewById(R.id.img_list_item);              holder.mTitle=(TextView)convertView.findViewById(R.id.text_list_item);              convertView.setTag(holder);          }else{              holder=(ViewHolder)convertView.getTag();          }          if(position == selectIndex){              convertView.setSelected(true);          }else{              convertView.setSelected(false);          }                    holder.mTitle.setText(mTitles[position]);          iconBitmap = getPropThumnail(mIconIDs[position]);          holder.mImage.setImageBitmap(iconBitmap);            return convertView;      }        private static class ViewHolder {          private TextView mTitle ;          private ImageView mImage;      }      private Bitmap getPropThumnail(int id){          Drawable d = mContext.getResources().getDrawable(id);          Bitmap b = BitmapUtil.drawableToBitmap(d);  //      Bitmap bb = BitmapUtil.getRoundedCornerBitmap(b, 100);          int w = mContext.getResources().getDimensionPixelOffset(R.dimen.thumnail_default_width);          int h = mContext.getResources().getDimensionPixelSize(R.dimen.thumnail_default_height);                    Bitmap thumBitmap = ThumbnailUtils.extractThumbnail(b, w, h);                    return thumBitmap;      }      public void setSelectIndex(int i){          selectIndex = i;      }  } 

下图是一个item被选定后,另一个item获得了焦点:

要点如下: 1、可以说这个HorizontalListView是完美的,但美中不足的并不是其他人说的不能点击、晃动、加载不全的问题,而是这个横向Listview的高度,如果你设成wrap_cotent那么将会占据整个屏幕,即使你将它适配器里的view的高度限制死,限制成很小,这个HorizontalListView的高度依然是全屏。本文代码里,我把图片缩略图弄成100dip,所以把这个HorizontalListView的高度设为了150dip。 2、在适配器里,我填充了一个图片,下面是文字。为了能让浏览图片时item有反应,搞了一个selector,它的用法详见这里. 但一开始在点击时完全没有反应。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭