Android动态加载布局

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"> 

 <LinearLayout
   android:padding="@dimen/small_space"
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"> 

  <com.view.RoundedImageView
    android:id="@+id/iv_myspace_usericon"
    android:src="@drawable/usericon"
    android:layout_width="50dp"
    android:layout_height="50dp"/>
  <TextView
    android: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"/>
  <TextView
    android: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>
 <TextView
   android: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"/>
 <ImageView
   android: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"/>
 <LinearLayout
   android: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
   android: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">
  <ImageView
    android:id="@+id/iv_myspace_like"
    android:src="@drawable/zan_icon"
    android:layout_width="20dp"
    android:layout_height="20dp"/>
   <ImageView
     android:visibility="gone"
     android:id="@+id/iv_myspace_liked"
     android:src="@drawable/wozaixianchang_dianzanxi"
     android:layout_width="20dp"
     android:layout_height="20dp"/>
  <TextView
    android: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"/>
  <ImageView
    android:id="@+id/iv_myspace_comment"
    android:layout_marginLeft="@dimen/middle_space"
    android:src="@drawable/pinglun_icon"
    android:layout_width="20dp"
    android:layout_height="20dp"/>
  <TextView
    android: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> 

<LinearLayout
   android: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() {
      @Override
      public 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);
     } 

    }

这段代码就全都包括了,其中一些里面的参数是服务器返回来的,都是真实数据。这样就可以点击头像跳转了。
那么最后看一下我自己实现的界面是不是和京东的一样呢?

怎么样是不是差不多?

(0)

相关推荐

  • Android 中动态加载.jar的实现步骤

    首先第一个是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不认 Java 的 byte code 的,所以不能直接这么打包,而要用 dx 工具转成 Dalvik byte code 才可以.当然,dx 工具转了之后,jar 包里面就不 是 .class 文件了,而是 .dex 文件. 第二个是,Android 里面虽然也提供了 URLClassLoader 的实现,但是并不能用.要动态加载其它类,

  • 亲自动手实现Android App插件化

    Android插件化目前国内已经有很多开源的工程了,不过如果不实际开发一遍,很难掌握的很好. 下面是自己从0开始,结合目前开源的项目和博客,动手开发插件化方案. 按照需要插件化主要解决下面的几种问题: 1. 代码的加载 (1) 要解决纯Java代码的加载 (2) Android组件加载,如Activity.Service.Broadcast Receiver.ContentProvider,因为它们是有生命周期的,所以要特殊处理 (3) Android Native代码的加载 (4) Andro

  • Android实现listview动态加载数据分页的两种方法

    在android开发中,经常需要使用数据分页,比如要实现一个新闻列表的显示,或者博文列表的显示,不可能第一次加载就展示出全部,这就需要使用分页的方法来加载数据,在android中Handler经常用来在耗时的工作中,它接收子线程发送的数据,并使用数据配合更新UI,AsyncTask是在一个线程中执行耗时操作然后把结果传给UI线程,不需要你亲自去管理线程和句柄. 一.使用Handler+线程方法 1.基础知识 Handler在android系统中,主要负责发送和接收消息,它的用途主要有以下两种:

  • Android应用开发中Fragment的静态加载与动态加载实例

    1.Fragment的静态使用 Fragment是作为Activity的UI的一部分,它内嵌在Activity中,多个Fragment可以把一个Activity分成多个部分,这在大屏幕手机或者平板电脑中会比较多的用到,这样就不用使用多个Activity来切换这么麻烦了.当然Fragment也可以不显示,只在后台处理一些数据,这篇文章中就暂时不谈到这个.以下来看怎么静态地在Activity的布局文件中添加Fragment. 自定义的Fragment通常要继承Fragment这个类,也有一些特殊的是

  • Android实现Listview异步加载网络图片并动态更新的方法

    本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法.分享给大家供大家参考,具体如下: 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片.店名.活动详情.地址.电话和距离等. 在布局文件中ListView的定义: <ListView android:id="@id/maplistview" android:background="@drawable/bg" android:layout_width=&qu

  • JavaScript插件化开发教程 (三)

    一,开篇分析 前面两篇文章我们主要讲述了以"jQuery的方式如何开发插件",以及过程化设计与面向对象思想设计相结合的方式是 如何设计一个插件的,两种方式各有利弊取长补短,本系列文章是以学习为导向的,具体场景大家自己定夺使用方式.那么今天从这篇文章开始,我们就以实例的方式带着大家由浅入深的开发属于自己的插件库.嘿嘿嘿,废话少说,进入正题.直接上实际效果图: 大家看到了吧,这是一个选项卡插件,在我们日常做那种单页应用("SPA")的时候或许会接触到,就拿今天的例子来说

  • Android动态加载Activity原理详解

    activity的启动流程 加载一个Activity肯定不会像加载一般的类那样,因为activity作为系统的组件有自己的生命周期,有系统的很多回调控制,所以自定义一个DexClassLoader类加载器来加载插件中的Activity肯定是不可以的. 首先不得不了解一下activity的启动流程,当然只是简单的看一下,太详细的话很难研究清楚. 通过startActivity启动后,最终通过AMS进行跨进程回调到ApplicationThread的scheduleLaunchActivity,这时

  • JavaScript插件化开发教程 (一)

    一,开篇分析 Hi,大家!今天这系列文章主要是说说如何开发基于"JavaScript"的插件式开发,我想很多人对"插件"这个词并不陌生, 有的人可能叫"组件"或"部件",这不重要,关键是看如何设计,如何做一个全方位的考量,这是本文的重点阐述的概念.我想大家对 "jQuery插件的方式"有一定的了解,我们结合这个话题一起讨论一下,最终给出相关的实现方案,来不断提高自己的谁能力. 二,进入插件正题 一般来说,j

  • android动态加载布局文件示例

    一.布局文件part.xml: 复制代码 代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="

  • Android插件化之资源动态加载

    Android插件化之资源动态加载 一.概述 Android插件化的一个重要问题就是插件资源访问问题,先列出会面对的问题 1.如何加载插件资源 2.如何处理插件资源与宿主资源的处突:插件化资源问题要做到的效果是,如果我们要获取的资源在插件中找得到,则加载优先加载插件的,如果找不到,则到宿主资源中找.这样能做到动态更新的效果. 3.如何确保插件和宿主使用到的是被修改过的资源. 二.原理分析 在做一件事之前必须先弄清楚原理,所以,这里先要弄清楚Android的资源体系原理. 1.资源链 Contex

随机推荐