最近一直比较忙,博客没及时写。最近项目中用到了动态加载布局,今天闲下来记录一下自己的学习经历吧。

ListView我们一直都在用,只不过当Adapter中的内容比较多的时候我们有时候没办法去设置一些组件,举个例子:

可以看到京东的故事里面的这样一个布局,这个布局可以说是我目前见到的内容比较多的了,它的每一项都包含头像、姓名、分类、内容、图片、喜欢、评论、分享以及喜欢的头像。分析了一下布局之后我们不难发现,除了喜欢头像这部分,其余的都很好实现。

那么下面着重说一下这个头像这部分怎么实现?

第一种方案:我们可以用GridView来实现,GridView和ListView的用法是一样的,俗称九宫格排列,那么我们可以将GridView的一行排列九张图片来显示这些头像,只不过ListView嵌套着GridView稍微的有些麻烦,自己做了一个,感觉不太好用,有想要ListView嵌套GridView的可以私密我。

第二种方案就是本篇文章所讲的动态加载布局了:

很简单,我们在ListView中定义一个LinerLayout线性布局,用来存放这些头像,先看一下布局吧:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:padding="@dimen/small_space"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><com.view.RoundedImageViewandroid:id="@+id/iv_myspace_usericon"android:src="@drawable/usericon"android:layout_width="50dp"android:layout_height="50dp"/><TextViewandroid:id="@+id/tv_myspace_username"android:layout_marginLeft="@dimen/middle_space"android:layout_gravity="center_vertical"android:text="王某某"android:textSize="@dimen/small_textSize"android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/tv_myspace_time"android:textColor="@color/normal_bar_futext_color"android:textSize="@dimen/smallest_textSize"android:layout_gravity="center_vertical"android:text="2015-8-26 17.46"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout><TextViewandroid:id="@+id/tv_myspace_content"android:paddingRight="@dimen/middle_space"android:paddingLeft="@dimen/middle_space"android:paddingBottom="@dimen/middle_space"android:text="受到了房间啊了会计分录会计法舰队司令减肥;立刻受到杰弗里斯到付款;老是觉得烦;老卡机的说法;就是看到的就发了卡就"android:layout_width="match_parent"android:layout_height="wrap_content"/><ImageViewandroid:id="@+id/iv_myspace_image"android:scaleType="fitXY"android:src="@drawable/moren"android:paddingRight="@dimen/middle_space"android:paddingLeft="@dimen/middle_space"android:layout_width="match_parent"android:layout_height="140dp"/><LinearLayoutandroid:id="@+id/ll_myspace_reply_icons"android:paddingTop="@dimen/small_space"android:paddingRight="@dimen/middle_space"android:paddingLeft="@dimen/middle_space"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"></LinearLayout><LinearLayoutandroid:layout_marginTop="@dimen/small_space"android:paddingRight="@dimen/middle_space"android:paddingLeft="@dimen/middle_space"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/iv_myspace_like"android:src="@drawable/zan_icon"android:layout_width="20dp"android:layout_height="20dp"/><ImageViewandroid:visibility="gone"android:id="@+id/iv_myspace_liked"android:src="@drawable/wozaixianchang_dianzanxi"android:layout_width="20dp"android:layout_height="20dp"/><TextViewandroid:id="@+id/tv_myspace_zan_count"android:layout_gravity="center_vertical"android:text="0"android:textColor="@color/normal_bar_futext_color"android:layout_marginLeft="@dimen/small_space"android:layout_width="wrap_content"android:layout_height="wrap_content"/><ImageViewandroid:id="@+id/iv_myspace_comment"android:layout_marginLeft="@dimen/middle_space"android:src="@drawable/pinglun_icon"android:layout_width="20dp"android:layout_height="20dp"/><TextViewandroid:id="@+id/tv_myspace_pinglun_count"android:layout_gravity="center_vertical"android:text="0"android:textColor="@color/normal_bar_futext_color"android:layout_marginLeft="@dimen/small_space"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout></LinearLayout>
<LinearLayoutandroid:id="@+id/ll_myspace_reply_icons"android:paddingTop="@dimen/small_space"android:paddingRight="@dimen/middle_space"android:paddingLeft="@dimen/middle_space"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"></LinearLayout>

上面的LinearLayout就是放这些头像的,其他的就不多说了,下面我们看看怎么来给我们的adapter里面加这些头像

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(100, 100);params.setMargins(8, 0, 8, 0);roundedImageView.setLayoutParams(params);roundedImageView.setScaleType(ImageView.ScaleType.FIT_XY);if (!"".equals(replyUrl.get(m)) && replyUrl.get(m) != null) {ImageLoader.getInstance().displayImage(replyUrl.get(m), roundedImageView);} else {roundedImageView.setImageDrawable(context.getResources().getDrawable(R.drawable.usericon));}if (m == count) {roundedImageView.setImageDrawable(context.getResources().getDrawable(R.drawable.wozaixianchangxiangqing_shenglve));} else {holder.llReplyIcons.addView(roundedImageView);}

我们先定义一个LayoutParams,设置头像图片的一些属性,包括大小,margins以及scaletype等,然后给它设置到我们的ImageView中,最后

holder.llReplyIcons.addView(roundedImageView);

添加子布局就ok了。京东这个是固定了头像的个数,而我写的则是根据手机屏幕的宽度添加头像:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);int width = wm.getDefaultDisplay().getWidth();int count = width / 116;

count就是可以添加的头像,当View中的i等于我们的count的时候,我们可以用最后的省略号的图片来显示。

之前在群里有人问我这个头像点击跳转到个人主页怎么实现的,想了一下,是不是可以用手机触摸的坐标来算一下坐标位于第几个头像之间,觉得那样比较麻烦。我们可以在添加子布局头像的时候,就给这个子布局设置点击事件,就可以了,看一下代码:

for (int m = 0; m < replyUrl.size(); m++) {RoundedImageView roundedImageView = new RoundedImageView(context);final int finalM = m;roundedImageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (story.getReply_user_id().get(finalM) != null) {Intent intent = new Intent(context, MyStoryActivity.class);intent.putExtra("userid", story.getReply_user_id().get(finalM));intent.putExtra("user_iconurl", story.getReply_user_icon_url().get(finalM));intent.putExtra("username", story.getReply_user_name().get(finalM));intent.putExtra("flag", "others");context.startActivity(intent);} else {Intent intent = new Intent(context, StoryFavoriteAcitvity.class);intent.putExtra("storyId", story.getId());context.startActivity(intent);}}});LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(100, 100);params.setMargins(8, 0, 8, 0);roundedImageView.setLayoutParams(params);roundedImageView.setScaleType(ImageView.ScaleType.FIT_XY);if (!"".equals(replyUrl.get(m)) && replyUrl.get(m) != null) {ImageLoader.getInstance().displayImage(replyUrl.get(m), roundedImageView);} else {roundedImageView.setImageDrawable(context.getResources().getDrawable(R.drawable.usericon));}if (m == count) {roundedImageView.setImageDrawable(context.getResources().getDrawable(R.drawable.wozaixianchangxiangqing_shenglve));} else {holder.llReplyIcons.addView(roundedImageView);}}

这段代码就全都包括了,其中一些里面的参数是服务器返回来的,都是真实数据。这样就可以点击头像跳转了。

那么最后看一下我自己实现的界面是不是和京东的一样呢?

怎么样是不是差不多?

对于这个圆形的头像是重写的一个RoundImageView,我之前的帖子也有介绍过,感兴趣的小伙伴可以看一下
Android 自定义上面圆角下面直角的ImageView
里面也有一些相关的介绍,请大家多多关注,以后还会继续维护我的博客,一些好的东西会拿出来跟大家分享,也希望各位多多指正不足之处共同学习,共同进步。

Android动态加载布局相关推荐

  1. android: 动态加载碎片布局的技巧

    虽然动态添加碎片的功能很强大,可以解决很多实际开发中的问题,但是它毕竟只是在 一个布局文件中进行一些添加和替换操作.如果程序能够根据设备的分辨率或屏幕大小在运 行时来决定加载哪个布局,那我们可发挥的空 ...

  2. Android动态加载进阶 代理Activity模式

    基本信息 作者:kaedea 项目:android-dynamical-loading 技术背景 简单模式中,使用ClassLoader加载外部的Dex或Apk文件,可以加载一些本地APP不存在的类, ...

  3. Android动态加载技术

    基本信息 Author:kaedea GitHub:android-dynamical-loading 我们很早开始就在Android项目中采用了动态加载技术,主要目的是为了达到让用户不用重新安装AP ...

  4. java layoutinflater_使用LayoutInflater动态加载布局和操作控件

    我们知道在Android中通过布局文件来描述软件的界面,而通常在Activity中都是使用setContentView()来将布局显示出来.但是如果我们在非Activity的情况下,而且需要对布局中的 ...

  5. Android应用开发提高系列(5)——Android动态加载(下)——加载已安装APK中的类和资源...

    前言  Android动态加载(下)--加载已安装APK中的类和资源. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://ov ...

  6. android 动态 dex,Android 动态加载dex

    首先如果仅仅是因为64K method的问题可以直接看这里DexGuard.Proguard.Multi-dex给出的解决方案. 本文主要讨论从编译层面,dex动态加载器选择层面以及安全层面讨论dex ...

  7. Android动态加载技术初探

    一.前言: 现在,已经有实力强大的公司用这个技术开发应用了,比如淘宝,大众点评,百度地图等,之所以采用这个技术,实际上,就是方便更新功能,当然,前提是新旧功能的接口一致,不然会报Not Found等错 ...

  8. Android动态加载黑科技 动态创建Activity模式

    基本信息 Author:kaedea GitHub:android-dynamical-loading 代理Activity模式的限制 还记得我们在代理Activity模式里谈到启动插件APK里的Ac ...

  9. Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...

    前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流! 关键字:Android动态加载 声明 欢迎转载, ...

最新文章

  1. Android学习笔记(11):线性布局LinearLayout
  2. hbase.client.keyvalue.maxsize的默认值
  3. onmouseover和onmouseout在GridView中应用
  4. GhostNet 测试
  5. IP Messenger程序
  6. Linux文件预读对系统的影响
  7. PHPMySQL——防止SQL注入-代码片段
  8. 快速排序 java导包_排序算法-快速排序(Java实现)
  9. php mysql随机记录_php随机取mysql记录方法小结
  10. 设置单元格填充方式_【WPS神技能】Excel表格中单元格内的双色填充效果有点意思!...
  11. HALCON学习之旅(五)
  12. LeetCode(905)——按奇偶排序数组(JavaScript)
  13. 配置Exchange邮箱完全访问权限
  14. c++学习笔记---指针
  15. 龙虎斗 详解(C++)
  16. 阿里面试失败后,一气之下我图解了Java中18把锁
  17. js一键批量打印_前端vue项目实现批量打印功能
  18. 同济大学Python程序设计基础 实验二:数据表示和处理
  19. 【Python习题】计算弓形的面积(保姆级图文+实现代码)
  20. vs2008 项目类型设置

热门文章

  1. ASP .NET Core 的运行机制和启动(转)
  2. 用户画像(一)利用mysql进行用户画像
  3. 23种设计模式的JAVA实现——访问者模式(行为型模式)
  4. 服务器客户端通信原理,客户端到服务器端通信原理
  5. npm WARN ajv-keywords@3.2.0 requires a peer of ajv@^6.0.0 but none is installed
  6. 用虚幻引擎制作逼真毛发:获取白皮书!
  7. dos批处理 for用法
  8. 微信JS-SDK说明文档---自己总结了config时的参数获取方式
  9. windows链接网络映射,切换账号
  10. java批量导出pdf文件_java导出pdf文件