Android 仿微信QQ聊天界面

一些IM聊天软件的展现形式是左右分开的形式。比如说,别人给你发的信息全部靠左显示,你自己发给别人的信息全部靠右显示。

而我们的ListView很多时候是显示同一个布局,其实BaseAdapter中有2个重要的方法在大多数情况下我们并未使用到,一个是public int getViewTypeCount(),显示ListView中有多少种布局(默认是显示是1),像微信那样聊天界面,是有2种布局方式;另外一个getItemViewType(),可以让不同item条目加载不同的布局,下面就简单的模拟下微信的聊天界面做法:

MainActivity.java

  1. package com.jackie.wechat;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseAdapter;
  10. import android.widget.ListView;
  11. import android.widget.TextView;
  12. public class MainActivity extends Activity {
  13. private ListView mListView;
  14. private List<Person> persons;
  15. private int TYPE_COUNT = 2;
  16. private int LEFT = 0;
  17. private int RIGHT = 1;
  18. private LayoutInflater
    mInflater;
  19. private MyAdapter adapter;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. mListView = (ListView) findViewById(R.id.listview);
  25. mInflater = LayoutInflater.from(this);
  26. initData();
  27. adapter = new MyAdapter();
  28. mListView.setAdapter(adapter);
  29. }
  30. private void initData() {
  31. persons = new ArrayList<Person>();
  32. for(int i
    = 0; i < 40;
    i++){
  33. Person person = new Person();
  34. person.setAge(i);
  35. person.setName("更深的蓝");
  36. if(i
    % 2 == 0){
  37. person.setType(0);
  38. } else {
  39. person.setType(1);
  40. }
  41. persons.add(person);
  42. }
  43. }
  44. private class MyAdapter extends BaseAdapter{
  45. @Override
  46. public int getCount() {
  47. return persons.size();
  48. }
  49. @Override
  50. public Object getItem(int position) {
  51. return persons.get(position);
  52. }
  53. @Override
  54. public long getItemId(int position) {
  55. return position;
  56. }
  57. @Override
  58. public int getItemViewType(int position) {
  59. if(persons.get(position).getType()
    == 0){
  60. return LEFT;
  61. }
  62. return RIGHT;
  63. }
  64. @Override
  65. public int getViewTypeCount() {
  66. return TYPE_COUNT;
  67. }
  68. @Override
  69. public View getView(int position, View convertView, ViewGroup parent) {
  70. ViewHolder mHolder;
  71. Person person = persons.get(position);
  72. if(getItemViewType(position)
    == LEFT) {
  73. if (convertView
    == null) {
  74. mHolder = new ViewHolder();
  75. convertView  = mInflater.inflate(R.layout.item_left, null);
  76. mHolder.tv_username = (TextView) convertView.findViewById(R.id.tv_username);
  77. mHolder.tv_age = (TextView) convertView.findViewById(R.id.tv_age);
  78. convertView.setTag(mHolder);
  79. } else {
  80. mHolder = (ViewHolder) convertView.getTag();
  81. }
  82. mHolder.tv_username.setText(person.getName());
  83. mHolder.tv_age.setText(String.valueOf(person.getAge()));
  84. } else {
  85. if(convertView
    == null){
  86. mHolder = new ViewHolder();
  87. convertView = mInflater.inflate(R.layout.item_right, null);
  88. mHolder.tv_username = (TextView) convertView.findViewById(R.id.tv_username);
  89. mHolder.tv_age = (TextView) convertView.findViewById(R.id.tv_age);
  90. convertView.setTag(mHolder);
  91. }else{
  92. mHolder = (ViewHolder) convertView.getTag();
  93. }
  94. mHolder.tv_username.setText(person.getName());
  95. mHolder.tv_age.setText(String.valueOf(person.getAge()));
  96. }
  97. return convertView;
  98. }
  99. private class ViewHolder
    {
  100. TextView tv_username;
  101. TextView tv_age;
  102. }
  103. }
  104. }

Person.java

[java] view
plain
copyprint?

  1. package com.jackie.wechat;
  2. public class Person {
  3. private String name;
  4. private int age;
  5. private int type;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public int getAge() {
  13. return age;
  14. }
  15. public void setAge(int age) {
  16. this.age = age;
  17. }
  18. public int getType() {
  19. return type;
  20. }
  21. public void setType(int type) {
  22. this.type = type;
  23. }
  24. }

item_left.xml

[html] view
plain
copyprint?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. android:background="#ffffff"
  7. >
  8. <RelativeLayout
  9. android:layout_width="fill_parent"
  10. android:layout_height="45dp"
  11. >
  12. <TextView
  13. android:id="@+id/tv_username"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:textSize="16sp"
  17. android:textColor="#123456"
  18. android:layout_centerVertical="true"
  19. android:layout_alignParentLeft="true"
  20. />
  21. <TextView
  22. android:id="@+id/tv_age"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:textSize="16sp"
  26. android:textColor="#123456"
  27. android:layout_centerVertical="true"
  28. android:layout_toRightOf="@id/tv_username"
  29. android:layout_marginLeft="20dp"
  30. />
  31. </RelativeLayout>
  32. </RelativeLayout>

item_right.xml

[java] view
plain
copyprint?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. android:background="#ffffff"
  7. >
  8. <RelativeLayout
  9. android:layout_width="fill_parent"
  10. android:layout_height="45dp"
  11. >
  12. <TextView
  13. android:id="@+id/tv_username"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:textSize="16sp"
  17. android:textColor="#123456"
  18. android:layout_centerVertical="true"
  19. android:layout_alignParentRight="true"
  20. />
  21. <TextView
  22. android:id="@+id/tv_age"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:textSize="16sp"
  26. android:textColor="#123456"
  27. android:layout_centerVertical="true"
  28. android:layout_toLeftOf="@id/tv_username"
  29. android:layout_marginRight="20dp"
  30. />
  31. </RelativeLayout>
  32. </RelativeLayout>
时间: 2024-08-03 18:29:01

Android 仿微信QQ聊天界面的相关文章

Android仿微信语音聊天界面

有段时间没有看视频了,昨天晚上抽了点空时间,又看了下鸿洋大神的视频教程,又抽时间写了个学习记录.代码和老师讲的基本一样,网上也有很多相同的博客.我只是在AndroidStudio环境下写的. --主界面代码-- public class MainActivity extends Activity { private ListView mListView; private ArrayAdapter<Recorder> mAdapter; private List<Recorder>

转-Android仿微信气泡聊天界面设计

微信的气泡聊天是仿iPhone自带短信而设计出来的,不过感觉还不错可以尝试一下仿着微信的气泡聊天做一个Demo,给大家分享一下!效果图如下: 气泡聊天最终要的是素材,要用到9.png文件的素材,这样气泡会随着聊天内容的多少而改变气泡的大小且不失真.为了方便,我就直接在微信里面提取出来啦. 聊天的内容是用ListView来显示的,将聊天的内容封装成一个ChatMsgEntity类的对象里面,然后交给自定义的ListView适配器将聊天内容显示出来. ChatMsgEntity.java比较简单,只

Android仿微信语音聊天

完整代码下载地址: Android仿微信语音聊天 效果图: 分析: 1.自定义Button中要复写onTouchEvent的DOWN,MOVE,UP三种状态,对正常按下,想要取消发送,抬起三种动作进行侦听处理. 2.Dialog共有三种状态,除上图所示的两种外,还有一个录音时间过短的提示.其中录音状态中的音量可以变化. 3.显示录音的ListView的item中有一个录音时长(TextView),一个播放动画(View)和一个头像(ImageView). 4.录音类里有两个成员:录音长度,录音路

腾讯大牛动态教学:Android 仿微信 QQ 图片裁剪,赶紧收藏起来!

前言 在平时开发中,经常需要实现这样的功能,拍照 - 裁剪,相册 - 裁剪.当然,系统也有裁剪的功能,但是由于机型,系统兼容性等问题,在实际开发当中,我们通常会自己进行实现.今天,就让我们一起来看看怎样实现. 这篇博客实现的功能主要有仿微信,QQ 上传图像裁剪功能,包括拍照,从相册选取.裁剪框的样式有圆形,正方形,九宫格. 主要讲解的功能点 使用说明 整体的实现思路 裁剪框的实现 图片缩放的实现,包括放大,缩小,移动,裁剪等 我们先来看看我们实现的效果图 使用说明 有两种调用方式 第一种 第一种

Android仿微信SlideView聊天列表滑动删除效果

package com.ryg.slideview; import com.ryg.slideview.MainActivity.MessageItem; //Download by http://www.okbase.net import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import andro

android 仿微信聊天界面

一些IM聊天软件我们发现,他的展现形式,是左右分开的形式,而我们的listview很多时候是显示同一个布局,其实BaseAdapter中有2个重要的方法在大多数情况下我们并未使用到,一个是public int getViewTypeCount(),它是显示listview中有多少种布局,默认是显示是1,像微信那样聊天界面,是有2种布局方式,:另外一个getItemViewType(),它是在那些item条目中显示那种布局,下面就简单的模拟下微信的聊天界面做法: MainActivity.java

Android—简单的仿QQ聊天界面

最近仿照QQ聊天做了一个类似界面,先看下界面组成(画面不太美凑合凑合呗,,,,): 其中聊天背景可以是一个LinearLayout或者RelativeLayout里面存放的是ListView(将ListView的分割线设置成透明:android:divider="#0000"否则聊天界面会显示出分割线,,,想想都屌,,,) 于是,我要上主界面的xml布局文件了: <?xml version="1.0" encoding="utf-8"?&g

亲身体验用Java写的仿qq聊天界面

Java开发工具有许多种,新手用记事本写Java程序,有些人用NetBean,jbuilder,高手用eclipse,下面介绍用eclipse开发qq聊天界面. 代码如下: package Myjava_QQ; import java.awt.*; import javax.swing.*; import Myjava_QQ.truess; import java.awt.event.*; import java.applet.*; import java.io.BufferedReader;

【iOS基础控件 - 11】【Demo】模仿qq ,微信 UI 聊天界面

A.需求 做出一个类似于QQ.微信的聊天界面 1.每个cell包含发送时间.发送人(头像).发送信息 2.使用对方头像放在左边,我方头像在右边 3.对方信息使用白色背景对话框,我方信息使用蓝色背景对话框 4.隐藏相同的发送时间 5.底部功能按钮:语音按钮.消息输入框.表情按钮.附加按钮 6.响应键盘事件,呼出键盘.隐藏键盘时对上述的视图作出上移操作 7.键盘的发送事件处理 Code Source: B.实现点 1.底层视图搭建 上部分聊天信息框:UITableView 下部分功能区:UIButt