众所周知,android里面的ListView是竖着的。

如果想要横向的话需要自定义一下ListView。

CSDN上面有个人描述了一下一个国外大神的自定义横向ListVIew  请点击 -->这里

自己也试了试这个HorizontalListView,发现bug还是不少 ,比如UI更新的时候排版总是不很正常,有时候item间距很大,有时候item间距很小。这让人很烦,所以就想着自己去实现以下简单的横向ListView

废话不多说:

布局  layout

<LinearLayout
android:id="@+id/imgContent"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="10"
android:gravity="center_vertical"
android:orientation="vertical" > <HorizontalScrollView
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="0dip"
android:background="#eee" > <LinearLayout
android:id="@+id/thumbnailLinearLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:orientation="horizontal" >
</LinearLayout>
</HorizontalScrollView>
</LinearLayout>

对,你没有看错。布局文件就这么简单。还有个 horizontal_list_item 布局下面要用,但是里面就只有一个ImageView所以就没贴出来。

横向的ListView只需要一个 HorizontalScrollView和LinearLayout 就足够了 。

但是你会有疑问了,仅仅这样不能获取到LinearLayout里面的item啊,不能获取到item就不能给每个子View添加监听。别着急,向下看。

activity代码

//已经定义好的全局变量
listCount = 0;
for(String imgUrl : imgUrlList){ listCount++;
//加载布局
View view = mInflater.inflate(R.layout.horizontal_list_item,null);
//找到ImageView
ImageView thumImg = (ImageView)view.findViewById(R.id.img_list_item);
//设定图片宽高(80*80)
int w = getResources().getDimensionPixelOffset(R.dimen.thumnail_default_width);
int h = getResources().getDimensionPixelSize(R.dimen.thumnail_default_height); //图片绑定设置 ImageOptions imageOptions = new ImageOptions.Builder()
.setRadius(DensityUtil.dip2px(10))//ImageView圆角半径
.setSize(w,h)
.setCrop(true)
.setImageScaleType(ScaleType.FIT_CENTER)
.setLoadingDrawableId(R.drawable.img_loading)//加载中默认显示图片
.setFailureDrawableId(R.drawable.img_fail)
.build();
//异步加载图片
x.image().bind(thumImg, imgUrl, imageOptions); //添加到布局中
thumbnailLinearLayout.addView(view);
} thumbnailLinearLayout.setOnTouchListener(new OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
 //获取到LinearLayout的宽度  注:在onCreat方法里面直接获取是0 所以要动态的获取
int width = thumbnailLinearLayout.getWidth();
//得到LinearLayout
int itemCount = thumbnailLinearLayout.getChildCount();
//计算出每一个child的平均宽度
float itemWidth = width/itemCount*1.0f;
              //得到点击的X坐标
float touchX = event.getX(0);

              //用这个式子算出点击坐标所在那个child上 (点击的坐标除以每个child的宽度 就可以得出所在child的索引) 需要 +1 吗?
int coverCount = (int) (touchX/itemWidth);

              //有了索引就能干一些事情了
              doSomething(coverCount); for(int i=0;i<itemCount;i++){
thumbnailLinearLayout.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
}
              //添加背景颜色,方便区别 所点击的那个child
thumbnailLinearLayout.getChildAt(coverCount).setBackgroundColor(Color.rgb(120, 120, 120));
return false;
}
});

这段java代码写在activity的初始化控件里面。

重点在 thumbnailLinearLayout 设定setOnTouchListener 的方法里面 本来LinearLayout不能获取到自己的item 。但是可以用child来代替。获取到child和总长度以及touch的坐标(只需要X轴坐标)就能判定点下去的那个点相对于LinearLayout子View的索引了。

这只是一个简单的横向ListVIew ,能实现基本的 相册预览 功能。如果需要高级功能就自己自定义吧。

逻辑都在代码注释里面了。什么?看不懂? QQ462195349

【android】简易实现横向的ListView的更多相关文章

  1. Android简易记事本

    此次做的Android简易记事本的存储方式使用了SQLite数据库,然后界面的实现比较简单,但是,具有增删改查的基本功能,这里可以看一下效果图,如下: 具体操作就是长按可以删除操作,点击可以进行修改, ...

  2. 【转】Android之自定义Adapter的ListView

    http://www.cnblogs.com/topcoderliu/archive/2011/05/07/2039862.html 在开发中,我们经常使用到ListView这个控件.Android的 ...

  3. Android 自学之列表视图ListView和ListActivity

    ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项. 创建ListView有两种方式: 直接使用ListView创建. 让Activity继承ListActivity ...

  4. android,在fragment中使用listview,不使用listfragment

    public class LeftFragment extends Fragment{ private ListView listView; @Override public View onCreat ...

  5. android学习--视图列表(ListView和ListActivity)

    说明: 视图列表(ListView和ListActivity)与AutoComplete.Spinner类似,它们都须要一个供显示的列表项,能够须要借助于内容Adapter提供显示列表项 创建List ...

  6. Android之自定义Adapter的ListView

    ListView的创建,一般要具备两大元素: 1)数据集,即要映射的字符串.图片信息之类. 2)适配器,实现把要映射的字符串.图片信息映射成视图(如Textview.Image等组件),再添加到Lis ...

  7. Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》

    转载博客请注明出处:道龙的博客 之前,写过一篇使用异步任务AysncTask实现倒计时的小案例,喜欢的话可以参考博客:Android简易实战教程--第三十三话< AsyncTask异步倒计时&g ...

  8. Android简易实战教程--第五十话《动画扫描》

    祝新年快乐!2017(一起)前行. 转载博客请注明出处:道龙的博客 本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条.对于自定义进度条前面有很详细的解析和案例了,本篇就结 ...

  9. Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》

    之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导, ...

随机推荐

  1. UVa 10346 - Peter's Smokes

    题目大意:Peter有n支烟,每k个剩下的烟头可以卷成一支新烟,问Peter能吸多少跟烟? 简单数学题. #include <cstdio> int main() { #ifdef LOC ...

  2. 转自他人——————TLE之前,没有一个节点叫失败!!!

    我想我十八年来记忆最深刻的夜晚,大概便是在吉林大学燥热的宿舍里,穿着橘黄色的短袖,努力咽下大口大口的雪碧.那天晚上我仰躺在吉大热得几乎不能入眠的床板上,一动不动,看夏夜里打不尽的蚊子在惨白的天花板下飞 ...

  3. KMP算法深入解析

    本文主要介绍KMP算法原理.KMP算法是一种高效的字符串匹配算法,通过对源串进行一次遍历即可完成对字符串的匹配. 1.基础知识的铺垫 字符串T的前k(0 =< k <=tlen)个连续的字 ...

  4. bzoj3991 [Sdoi2015]寻宝游戏 set动态维护虚树+树链求并

    题目大意:支持多次操作,增加或删除一个关键点 动态维护虚树边权和*2 分析:可以用树链求并的方法,最后减去虚树的根到1距离 注意到树链求并是所有点到根距离-所有dfn序相邻两点的LCA到根距离 找df ...

  5. DDD设计一个电商网站

    DDD设计一个电商网站(十一)-- 最后的准备    阅读目录 前言 准备 实现 结语 一.前言 最近实在太忙,上周停更了一周.按流程一步一步走到现在,到达了整个下单流程的最后一公里--结算页的处理. ...

  6. Ubuntu 14.04下搭建Node.js的开发环境

    最近想找一个轻量级且支持快速开发的服务开发平台,选来选去选择了Node.js,当时有几种选择: Python + Django(用过Django,虽然开发快速,但是感觉性能并不太好). Ruby + ...

  7. Spring @Aspect进行类的接口扩展

    Spring @Aspect进行类的接口扩展: XML: <?xml version="1.0" encoding="UTF-8"?> <be ...

  8. jQuery查询性能考虑

    http://blog.163.com/neusoft_hao@yeah/blog/static/120544724201282810510215/

  9. 深入浅出 Java Concurrency 锁机制 : AQS

    转载:http://www.blogjava.net/xylz/archive/2010/07/06/325390.html 在理解J.U.C原理以及锁机制之前,我们来介绍J.U.C框架最核心也是最复 ...

  10. Swiper --移动端触摸滑动插件

    Swiper使用方法 1.首先加载插件,需要用到的文件有swiper.min.js和swiper.min.css文件. <!DOCTYPE html> <html> <h ...