Android社交类APP动态详情代码实现通用模板



Android社交类APP动态详情代码实现通用模板


Android平台上一些比较流行的社交类APP比如微信、陌陌等,都有动态详情页,在该页面,用户发表的动态详情,好友可以发起评论、点赞等等。这种设计在微信和陌陌上大同小异。我自己写了一个较为通用的模板,记下作为备忘和参考,更多更丰富的内容可据此深入定制和开发。
思路:整体是一个ListView实现,ListView添加一个header,作为该用户发送的动态详情呈现页面,然后在ListView下面的item里面是该用户的好友们发表的评论等等。
ListView下方是一个单独的布局,该布局放置一个EditText和Button,供发送评论。
先看代码运行的结果:


实现代码:
测试的主Activity:MainActivity.java:

package zhangphil.detail;import java.util.Random;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);LayoutInflater mLayoutInflater = LayoutInflater.from(this);View view = View.inflate(this, R.layout.activity_main, null);ListView listView = (ListView) view.findViewById(android.R.id.list);// 每条评论的适配器ArrayAdapter adapter = new MyArrayAdapter(this, -1);listView.setAdapter(adapter);listView.setHeaderDividersEnabled(false);// ListView的头部View v = mLayoutInflater.inflate(R.layout.listview_head, null);listView.addHeaderView(v);TableLayout tableLayout = (TableLayout) v.findViewById(R.id.tableLayout);final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;// 随机生成若干张测试图片的量值。int total = new Random().nextInt(10);int ROW = 0;int mod = total % 3;if (mod == 0)ROW = total / 3;elseROW = total / 3 + 1;Context context = this;// 转换成ROW行3列的格式。int k = 0;for (int i = 0; i < ROW; i++) {TableRow tableRow = new TableRow(this);for (int j = 0; j < 3; j++) {if (k < total) {// 测试图片ImageView iv = new ImageView(context);iv.setImageResource(R.drawable.ic_launcher);tableRow.addView(iv);k++;}}tableLayout.addView(tableRow, new TableLayout.LayoutParams(WC, WC));}setContentView(view);}private class MyArrayAdapter extends ArrayAdapter {private LayoutInflater mLayoutInflater;public MyArrayAdapter(Context context, int resource) {super(context, resource);mLayoutInflater = LayoutInflater.from(context);}@Overridepublic View getView(int pos, View convertView, ViewGroup parent) {if (convertView == null)convertView = mLayoutInflater.inflate(R.layout.comment_item, null);return convertView;}// 返回一个测试数据量值@Overridepublic int getCount() {return 5;}}
}


MainActivity.java需要的布局文件:activity_main.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><ListViewandroid:id="@android:id/list"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_above="@+id/commentLinearLayout"android:layout_gravity="center"android:scrollbars="none" /><LinearLayoutandroid:id="@+id/commentLinearLayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="#e0e0e0"android:orientation="horizontal" ><EditTextandroid:id="@+id/commentEditText"android:layout_width="0dip"android:layout_height="wrap_content"android:layout_weight="8"android:hint="发表评论" /><Buttonandroid:id="@+id/buttonSend"style="?android:attr/buttonStyleSmall"android:layout_width="0dip"android:layout_height="wrap_content"android:layout_weight="2"android:text="发送" /></LinearLayout></RelativeLayout>



ListView头部布局用到的listview_head.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#f5f5f5"android:padding="5dip"android:paddingBottom="20dip" ><ImageViewandroid:id="@+id/imageViewHead"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_marginTop="5dip"android:adjustViewBounds="true"android:maxHeight="60dip"android:maxWidth="60dip"android:padding="1dip"android:src="@drawable/head" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="5dip"android:layout_toRightOf="@+id/imageViewHead"android:orientation="vertical"android:padding="1dip" ><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="1dip" ><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_centerVertical="true"android:text="姓名某某某"android:textColor="@android:color/black"android:textSize="13sp"android:textStyle="bold" /><TextViewandroid:id="@+id/time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:layout_centerVertical="true"android:text="2015-09-16"android:textSize="9sp" /></RelativeLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dip"android:background="#EFEFEF"android:padding="1dip" /><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dip"android:text="标题" /><TextViewandroid:id="@+id/detail"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="5dip"android:text="一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字,一些文字"android:textSize="11sp" /><TableLayoutandroid:id="@+id/tableLayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:shrinkColumns="0,1,2" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="1dip" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:drawableLeft="@drawable/favorite"android:gravity="bottom|right"android:padding="1dip"android:text="99+"android:textSize="8sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:drawableLeft="@drawable/comment"android:gravity="bottom|right"android:padding="1dip"android:text="99+"android:textSize="8sp" /></LinearLayout></RelativeLayout></LinearLayout></RelativeLayout>


ListView适配器加载的每一个item的布局文件:comment_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"android:padding="15dip" ><ImageViewandroid:id="@+id/head"android:layout_width="30dip"android:layout_height="30dip"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:src="@drawable/ic_launcher" /><TextViewandroid:id="@+id/comment"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="2dip"android:layout_toRightOf="@+id/head"android:gravity="center"android:padding="1dip"android:text="哎哟,不错哦!" /><TextViewandroid:id="@+id/time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:gravity="center"android:text="20:30" /></RelativeLayout>


其中,图片素材head.png、comment.png、favorite.png可以自行根据喜好选取。


附我写的另外一篇与此相关的参考文章:
《Android社交类APP常用的动态消息发布通用模板》
文章链接:http://blog.csdn.net/zhangphil/article/details/48467309


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊并发编程的12种业务场景

前言并发编程是一项非常重要的技术&#xff0c;无论在面试&#xff0c;还是工作中出现的频率非常高。并发编程说白了就是多线程编程&#xff0c;但多线程一定比单线程效率更高&#xff1f;答&#xff1a;不一定&#xff0c;要看具体业务场景。毕竟如果使用了多线程&#xff0c;…

软件工程编码阶段_软件工程的编码阶段

软件工程编码阶段The coding phase in the software engineering paradigm is usually defined after the designing phase. In this phase, the developers or the coders have to implement the software design practically using any computer language(s) so that the sof…

梳理50道经典计算机网络面试题

我梳理了50道计算机网络面试题&#xff0c;每一道题目都特别经典&#xff0c;大厂也非常喜欢问。相信大家看完&#xff0c;会有新的收获滴~1. 说说HTTP常用的状态码及其含义&#xff1f;思路: 这道面试题主要考察候选人&#xff0c;是否掌握HTTP状态码这个基础知识点。不管是不…

A successful Git branching model

原文&#xff1a;http://nvie.com/posts/a-successful-git-branching-model/ In this post I present the development model that I’ve introduced for all of my projects (both at work and private) about a year ago, and which has turned out to be very successful. I…

一文详解读写锁

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;读写锁&#xff08;Readers-Writer Lock&#xff09;顾名思义是一把锁分为两部分&#xff1a;读锁和写锁&#xff0c…

ruby array_Ruby中带有示例的Array.keep_if方法

ruby arrayRuby Array.keep_if方法 (Ruby Array.keep_if Method) In the last articles, we have studied the Array methods namely Array.select, Array.reject and Array.drop_while, all these methods are non–destructive methods which means that they do not impose …

[实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册

写在前面 上篇文章简单介绍了项目的结构&#xff0c;这篇文章将实现用户的注册。当然关于漂亮的ui&#xff0c;这在追后再去添加了&#xff0c;先将功能实现。也许代码中有不合适的地方&#xff0c;也只有在之后慢慢去优化了。 系列文章 [EF]vs15ef6mysql code first方式 [实战…

Calico IP_AUTODETECTION_METHOD

在 Calico 中&#xff0c;IP_AUTODETECTION_METHOD 的配置项用于指定 Calico 如何检测容器的 IP 地址。 一、kubernetes-internal-ip模式 其中&#xff0c;kubernetes-internal-ip 是一种特殊的模式&#xff0c;用于在 Kubernetes 环境中检测容器的 IP 地址。具体作用如下&…

下个十年高性能 JSON 库来了:fastjson2!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;fastjson2 是 fastjson 项目的重要升级&#xff0c;目标是为下一个十年提供一个高性能的 JSON 库&#xff0c;同一套 API 支…

ascii非打印控制字符表_C程序打印ASCII表/图表

ascii非打印控制字符表什么是ASCII码&#xff1f; (What are ASCII Codes?) ASCII stands for American Standard Code for Information Interchange; it is a character encoding standards for information interchange in electronics communication. Each alphabets, spec…

THEOS的第一个TWeak的成功创建

THEOS的第一个TWeak的成功创建THEOS的第一个TWeak的成功创建参考资料:成功的创建一个TWeak的弹出步骤1:安装Xcode和Xcode command line步骤2:安装theosa:下载theos前,设置保存的路径:环境变量b:下载theosc:下载头文件d:下载ldid签名工具e:配置MoblieSubstrate环境f:安装dpkg步骤…

查询中,有没有可能多个索引一起用呢?

其实我们之前所讲的回表&#xff0c;就是两个索引树同时使用&#xff0c;先在二级索引树中搜索到对应的主键值&#xff0c;然后在再去主键索引树中查询完整的记录。但是我今天的问题是&#xff0c;两个不同的二级索引树&#xff0c;会同时生效吗&#xff1f;理论上来说&#xf…

ruby array_Ruby中带有示例的Array.sample()方法

ruby arrayArray.sample()方法 (Array.sample() Method) In this article, we will study about Array.sample() method. You all must be thinking the method must be doing something which is quite different from all those methods which we have studied. It is not as…

ThreadLocal夺命11连问

前言前一段时间&#xff0c;有同事使用ThreadLocal踩坑了&#xff0c;正好引起了我的兴趣。所以近期&#xff0c;我抽空把ThreadLocal的源码再研究了一下&#xff0c;越看越有意思&#xff0c;发现里面的东西还真不少。我把精华浓缩了一下&#xff0c;汇集成了下面11个问题&…

关于静态库、动态库的区别汇总

real framework中不可以使用类别 或 不可以不包含类文件real framework 中直接调用NSClassFromString函数会返回null 需要强制加载指定类 或 直接通过类名引用linux中静态库和动态库的区别一、不同库从本质上来说是一种可执行代码的二进制格式&#xff0c;可以被载入内存中执行…

PHP array_pad()函数与示例

PHP array_pad()函数 (PHP array_pad() function) array_pad() function is used to pad an array to given size with a specified value and returns a new array with a specified value. array_pad()函数用于将数组填充到具有指定值的给定大小&#xff0c;并返回具有指定值…

Spring Boot 优雅配置多数据源

大约在19年的这个时候&#xff0c;老同事公司在做医疗系统&#xff0c;需要和HIS系统对接一些信息&#xff0c;比如患者、医护、医嘱、科室等信息。但是起初并不知道如何与HIS无缝对接&#xff0c;于是向我取经。最终经过讨论采用了视图对接的方式&#xff0c;大致就是HIS系统提…

(转)新ITC提交APP常见问题与解决方法(Icon Alpha,Build version,AppIcon120x120)(2014-11-17)...

1&#xff09;ICON无法上传&#xff0c;提示图片透明&#xff08;有Alpha通道&#xff09;苹果现在不接受png里的Alpha了&#xff0c;提交的图标带有Alpha通道就提示&#xff1a;简单处理&#xff1a;用自带的预览打开&#xff0c;导出时不勾选Alpha&#xff0c;仍保存为png格式…

python 向量取整数_随机整数向量| 使用Python的线性代数

python 向量取整数Prerequisite: 先决条件&#xff1a; Defining a Vector using list 使用列表定义向量 Defining Vector using Numpy 使用Numpy定义向量 Random Integer Vector is a type of vector having a random integer value at each entry. Such types of vectors ha…

Spring 夺命 35 问!

有人说&#xff0c;“Java程序员都是Spring程序员”&#xff0c;可以看出Spring在Java世界里举足轻重的作用。基础1.Spring是什么&#xff1f;特性&#xff1f;有哪些模块&#xff1f;Spring Logo一句话概括&#xff1a;Spring 是一个轻量级、非入侵式的控制反转 (IoC) 和面向切…