当前位置:首页 > 芯闻号 > 充电吧
[导读]本文内容: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,它的用法详见这里. 但一开始在点击时完全没有反应。

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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭