安卓模拟聊天界面---改编第一行代码

主界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#d8e0e8"
android:orientation="vertical" >

<ListView
android:id="@+id/msg_list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:divider="#000"></ListView>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>

<EditText
android:id="@+id/input_text"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
android:hint="请输入聊天内容"/>

<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"></Button>

</LinearLayout>

</LinearLayout>

消息item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp" >

<LinearLayout
android:id="@+id/left_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:background="@drawable/message_left">

<TextView
android:id="@+id/left_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dip"
android:textColor="#fff"/>
</LinearLayout>

<LinearLayout
android:id="@+id/right_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:background="@drawable/message_right">

<TextView
android:id="@+id/right_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dip"
android:textColor="#fff"/>
</LinearLayout>

</LinearLayout>

消息类

package com.example.thingking_in_android;

//消息类
public class Msg {
public static boolean flag=true;

public static final int TYPE_RECEIVED=0;

public static final int TYPE_SENT=1;

private String content;
private int type;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public Msg(String content, int type) {
super();
this.content = content;
this.type = type;
}

}

主类

package com.example.thingking_in_android;

import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;

import com.example.thingking_in_android.R.layout;

import android.R.anim;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

/**
* 模拟聊天
* @author 黄二狗 参考第一行代码改编
*
*/

public class HelloActivity extends Activity {
//聊天 列表视图
private ListView msgListView;

//输入信息框
private EditText inputText;

//发送按钮
private Button send;

List<Msg>list;

myAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {

System.out.println("begin");
super.onCreate(savedInstanceState);
//不显示标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);

//加载布局文件
this.setContentView(R.layout.activity_main);

//设置数据
list=new ArrayList();
Msg msg1=new Msg("Hello I‘am jack!",Msg.TYPE_RECEIVED);
Msg msg2=new Msg("Hello are you ok?",Msg.TYPE_SENT);
Msg msg3=new Msg("Yes I am very ok!",Msg.TYPE_RECEIVED);
Msg msg4=new Msg("That‘s all right!",Msg.TYPE_SENT);
list.add(msg1);
list.add(msg2);
list.add(msg3);
list.add(msg4);

//获取相应的视图组件
inputText=(EditText)findViewById(R.id.input_text);
send=(Button)findViewById(R.id.send);
msgListView=(ListView)findViewById(R.id.msg_list_view);

adapter=new myAdapter();
System.out.println(adapter);
System.out.println(list);
msgListView.setAdapter(adapter);
//为发送按钮添加事件
send.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//获取用户输入数据
String content=inputText.getText().toString();
//判断数据是否为空
if(!"".equals(content))
{
//模拟一发一收的情况

Msg msg;
if(Msg.flag)
{
msg=new Msg(content,Msg.TYPE_SENT);

}
else
{
msg=new Msg(content,Msg.TYPE_RECEIVED);
}

Msg.flag=!Msg.flag;
list.add(msg);

adapter.notifyDataSetChanged(); //当有新消息时 刷新ListView的显示

inputText.setText("");
}

}
});

}

class myAdapter extends BaseAdapter
{

@Override
public int getCount() {

return list.size();
}

@Override
public Object getItem(int position) {
return list.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

System.out.println("加载===");
//加载布局 并设置数据

Msg msg=list.get(position);
View view;
viewHolder viewHolder;
//布局会重新加载 所以需要缓冲
if(convertView==null)
{
view=LayoutInflater.from(HelloActivity.this).inflate(R.layout.msg_item,null);
//将视图存储到对象中
viewHolder=new viewHolder();

viewHolder.leftLayout=(LinearLayout)view.findViewById(R.id.left_layout);
viewHolder.rightLayout=(LinearLayout)view.findViewById(R.id.right_layout);

viewHolder.leftMsg=(TextView)view.findViewById(R.id.left_msg);
viewHolder.rightMsg=(TextView)view.findViewById(R.id.right_msg);

//视图可以存储对象
view.setTag(viewHolder);

}
else
{
view=convertView;
viewHolder=(viewHolder)view.getTag();
}

//设置资源
if(msg.getType()==Msg.TYPE_RECEIVED)
{
viewHolder.leftLayout.setVisibility(View.VISIBLE);
viewHolder.rightLayout.setVisibility(View.GONE);
viewHolder.leftMsg.setText(msg.getContent());
}

else if (msg.getType()==Msg.TYPE_SENT)
{
viewHolder.rightLayout.setVisibility(View.VISIBLE);
viewHolder.leftLayout.setVisibility(View.GONE);
viewHolder.rightMsg.setText(msg.getContent());
}

return view;

}

}

}

时间: 2024-12-11 14:09:43

安卓模拟聊天界面---改编第一行代码的相关文章

安卓开发学习历程1——《第一行代码》coolweather项目setOnItemClickListener函数,Sql语句修改对模拟app程序机影响

今天,将<第一行代码>最后实战的coolweather项目,认真做了一遍. 今晚,在书中第一阶段开发代码认眞在Android studio敲完,发现setOnItemClickListener函数按照书中报错,原书如下所示: 但这样,报错,gradel提示该类不存在,现在还不清楚是不是因为作者版本太旧的原因,有待查证,后面,我用了下面方法,就编译通过,如下: 其实,我就是调用了AdapterView里面的OnItemClickListener方法而已. 此外,还发现一个问题,那就是我在grad

安卓开发学习经历2--《第一行代码》coolweather项目SQL语句同一个“陷阱”掉两次 注意转义字符等特殊字符正确书写 关于Id字段自增加体会

今天,在运行<第一行代码>coolweather第二阶段代码,又一次报错,还是神奇地与昨天相似,提示,city_id字段不存在,这里我有两种理解,一种是sql语句出错了,另外一种是没有获取city_id值,关于前一种,我在”详细“检查比较了,County表的建表语句后,首先排除了,然后一股脑投入如何解决第二种问题当中,最后,再一次惨痛事实告诉我,以后只要提示“no such column” 的提示,那么毫无疑问,肯定是数据库里面没有这个字段也就是说,sql语句建表那里就出错了.如图: sql语

第一行代码:以太坊(3)-使用更多的工具编写和测试智能合约

<第一行代码:以太坊>开始连载了 在上文中已经使用了Remix环境运行和测试了本书编写的第一个智能合约程序,不过编写和测试智能合约的测试方式很多,例如,在testrpc环境测试:在Intellij IDEA集成开发环境中用Solidity语言编写智能合约:在纯Web环境中测试智能合约:使用AJAX方式测试智能合约等.本文将详细介绍这些用于编写和测试智能合约的方法. 1.安装本地remix环境(Windows.Mac OS X和Linux) 在本节使用Remix环境运行和测试了Calc智能合约,

Android开发——《第一行代码》自学中

大学时候学过C++,Java,算法,数据结构以及其他很多东西,但都学的不精.就要毕业照工作了,总要专注于一门技术,于是开始学安卓. 开发环境是在慕课网下的eclipse. <第一行代码>这本书我也才只看了不到一半,学到第五章广播,但犯过很多错误,抛出来嘲笑下以前的自己,大家引以为戒. 1 有安卓手机就不要用模拟器 由于各种教程都在使用安卓模拟器,导致我一开始学习也在用.但这个实在是很麻烦,我的电脑本来就是渣配置,模拟器开机就要等一年,开机后点个按钮都要等半天.而且经常卡的我的eclipse都不

第一行代码----android篇1.0:活动

   做.NET有4年了,最近由于个人兴趣开始学习Android,网上看了下,郭霖老师的”第一行代码“不错,就以此为教程,写个博客,希望共勉吧!   1:活动是什么及其基本用法    活动是什么,英文名称是“Activity”,专业定义是“一种可以包含用户界面的组件,主要用于和用户进行交互”.在我看来就是.net中的aspx页面,但又不完全是.    如何建立?    如上图所示,点击上图Browse       点击ok,建立活动.活动建立显示的初始页面如下. 到此,建立活动,其实就是一个类,

《第一行代码——Android》封面诞生记

<第一行代码——Android>已经上市快一个月了,目前销售情况还算良好,也是特别感谢众多朋友的支持.其实一本书如果想要卖的好,除了内容必 须要给力之外,封面的设计也是至关重要的,而本书的封面无疑是在充实的内容之外又披上了一层华丽的外衣.作为作者,其实我的任务就是将内容写好而已,其它 所有相关工作都不是由我负责的.本书封面设计的所有细节都是由陈冰先生一手抓起的,之后他在图灵社区上记录了本书封面的诞生过程.在经过他同意的情况下, 我将这篇文章转到我的博客上,也是让感兴趣的朋友们了解一些不为人知的

《Android第一行代码》笔记

学习Android开发差不多有两年时间了,期间也做了大大小小的一些项目.近来抽出闲暇想把Android基础强化一下,之前在网上看到了郭霖郭大神的几篇博客,从中受益不少.于是花了近一周时间看完了郭神的一本Android教材--<Android第一行代码>.这本书相比其他教材个人感觉更为基础,内容很实用.看完之后我也有一些收获,学到了一些可以很好的运用到实际中的Android小技巧,下面从中选出我认为很有价值的地方做个记录.同时欢迎各位指正补充~~ 1.查看当前界面处于哪个Activity. 很多

最常用和最难用的控件--ListView(Android第一行代码)

由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有 大量的数据需要展示的时候,就可以借助 ListView 来实现.ListView 允许用户通过手指上下 滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕. 1.ListView 的简单用法首先新建一个 ListViewTest 项目,并让 ADT 自动帮我们创建好活动.然后修改activity_main.xml 中的代码,如下所示: <LinearLayout xmlns:android=&qu

第一章:开启启程你的第一行代码

前言: 其实我是认为视频比书本学的更快,看书是多么无趣, 有人说培训机构的学生失去了自学能力,的确如此 不管是视频还是资料我认为学会技能使用方法就行了 (还是买了第一行代码,一起学习学习吧!有颜色代表重点内容) 目录: 1.1 了解全貌,Android王国简介 1.1.1 安卓系统架构 1.1.2 安卓已经发布的版本 1.13 安卓应用开发特色 1.2 手把手搭建开发环境 1.2.1准备需要的环境 1.2.2搭建开发环境 1.3 创建你的一个Android项目 1.3.1创建Hello Worl