ListView仿QQ对话界面
来源:互联网 发布:手机歌词软件 编辑:程序博客网 时间:2024/05/20 01:12
本人一直忙于做项目,以至于没有时间整理自己的博客,近来偷得半日闲,特来装饰 (充实)一下自己的空间。
首先上图:
下面进入正题:
一、辅助类准备
package com.example.administrator.myapplication;
public class Chat { private String time;//消息发送的时间 private String name;//消息发送方 private String text;//消息内容 private boolean lay;//标志,该消息来自于谁 //时间 public void settime(String time) { this.time = time; } public String gettime(){ return time; } //姓名 public void setname(String name) { this.name = name; } public String getname(){ return name; } //消息 public void settext(String text) { this.text = text; } public String gettext(){ return text; } //布局 public void setlay(boolean lay) { this.lay= lay; } public boolean getlay(){ return lay; }}
二、后台工作:
1.数据库准备
这里applyor为申请人,friends为被申请人,isok默认为0,当friends同意了applyor的申请,isok更新(update)为1,表示两人成为好友,接下来qq为发送的消息,time为发送的时间,flag表示消息来自于谁。
首先从数据库加载历史消息,得有个查找条件吧,不然岂不是把和所有人的聊天信息都查出来了。这里可以假设我是applyor,那么:
Cursor cursor = sqLiteDatabase.query("friend", new String[]{"qq","time","flag"}, " applyor=? and friends=? and isok=?", new String[]{me,friends,"1"}, null, null, null); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { String qq = cursor.getString(0); String time1=cursor.getString(1); String flag=cursor.getString(2); Chat chat=new Chat(); //设置时间 chat.settime(time1); //设置消息 chat.settext(qq); //设置姓名和布局 if(flag.equals("1")){//消息是我发的
chat.setname(me); chat.setlay(false); }else{//消息是对方发的 chat.setname(friends); chat.setlay(true); } alllist.add(chat); } myListViewAdapter=new MyListViewAdapter(Friend_chat.this,alllist); wechat_listview.setAdapter(myListViewAdapter);}
2.重点就在于这个myListViewAdapter了:
这里的chat_left:package com.example.administrator.myapplication;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2016/10/30. */public class MyListViewAdapter extends BaseAdapter { private Context context; private List<Chat> list=new ArrayList<Chat>(); private LayoutInflater inflater; //构造函数,传递参数 public MyListViewAdapter(Context context, List<Chat> list){ this.context=context; this.list=list; this.inflater= LayoutInflater.from(context); } //以下不可以缺少,否则布局不对 public static interface IMsgViewType { int IMVT_COM_MSG = 0; int IMVT_TO_MSG = 1; } public int getItemViewType(int position) { // TODO Auto-generated method stub Chat entity = list.get(position); if (entity.getlay()) { return IMsgViewType.IMVT_COM_MSG; } else { return IMsgViewType.IMVT_TO_MSG; } } public int getViewTypeCount() { // TODO Auto-generated method stub return 2; }//以上不可以缺少,否则布局不对 @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final Chat chat=list.get(position); boolean lay=chat.getlay(); ViewHolder viewHolder=null; if (convertView==null){ //还没有多余的item布局 if (lay==true){//左布局 convertView = inflater.inflate(R.layout.chat_left, null); }else{//右布局 convertView = inflater.inflate(R.layout.chat_right, null); } viewHolder=new ViewHolder(); viewHolder.time=(TextView)convertView.findViewById(R.id.time); viewHolder.text=(TextView)convertView.findViewById(R.id.text); viewHolder.pername=(TextView)convertView.findViewById(R.id.pername); viewHolder.isComMsg=lay; convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.time.setText(chat.gettime()); viewHolder.text.setText(chat.gettext()); viewHolder.pername.setText(chat.getname()); return convertView; } static class ViewHolder{ public TextView time; public TextView text; public TextView pername; public boolean isComMsg = true; }}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" > <TextView android:layout_centerHorizontal="true" android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <RelativeLayout android:layout_below="@+id/time" android:layout_width="fill_parent" android:layout_height="wrap_content"> <RelativeLayout android:id="@+id/t1" android:layout_alignParentLeft="true" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/tp" android:src="@drawable/hua" android:layout_width="50dp" android:layout_height="50dp" /> <TextView android:layout_below="@+id/tp" android:id="@+id/pername" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> <TextView android:background="@drawable/chatfrom_bg_focused" android:layout_toRightOf="@+id/t1" android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout></RelativeLayout>
相同的,chat_right只是图片的位置不同而已:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" > <TextView android:layout_centerHorizontal="true" android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <RelativeLayout android:layout_below="@+id/time" android:layout_width="fill_parent" android:layout_height="wrap_content"> <RelativeLayout android:id="@+id/t1" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/tp" android:src="@drawable/shan" android:layout_width="50dip" android:layout_height="50dip" /> <TextView android:layout_below="@+id/tp" android:id="@+id/pername" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> <TextView android:background="@drawable/chatto_bg_focused" android:layout_toLeftOf="@+id/t1" android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout></RelativeLayout>
思路就是这样,因为是左右两个布局,所以写了chat_left和chat_right两个layout文件,然后设个flag(即Chat里面的lay)来选择要用的布局,而这个flag又是怎么插进数据库的呢?
3.请看下面的代码:
public void Send(View view) {//图中的发送按钮点击事件
String mass= Friend_chat.this.massage.getText().toString(); String m_assage =mass; if (m_assage.length() >= 1){ send.setEnabled(true); ContentValues contentValues = new ContentValues(); contentValues.put("applyor",friends); contentValues.put("friends",name); contentValues.put("isok","1"); contentValues.put("qq", m_assage); contentValues.put("time", shijian); contentValues.put("flag","1");//这里消息是我发的,代表自己说的
long a = sqLiteDatabase.insert("friend", null, contentValues); ContentValues contentValues1=new ContentValues(); contentValues1.put("applyor",name);//上面说了,查询的时候条件设为我是applyor,所以插入两次,第一次保证我发的消息在我这边能看到,第二次保证我发的消息对方也能看到,反之对方发的消息也是这个道理(因为这个我是相对的,表示当前登录方)。
contentValues1.put("friends",friends); contentValues1.put("isok","1"); contentValues1.put("qq", m_assage); contentValues1.put("time", shijian); contentValues1.put("flag","0");//放到对方那边,我的身份是朋友
long b = sqLiteDatabase.insert("friend", null, contentValues1); //if((a>0) && (b>0)) Toast.makeText(Friend_chat.this, "发送成功", Toast.LENGTH_SHORT).show(); Chat chat = new Chat(); chat.settime(shijian); chat.setname(name); chat.settext(m_assage); chat.setlay(false); alllist.add(chat); myListViewAdapter.notifyDataSetChanged(); Friend_chat.this.massage.setText(" ");}
}
0 0
- ListView仿QQ对话界面
- ListView自定义Adapter实现仿QQ界面
- UILabel仿qq对话
- 仿QQ界面
- 仿腾讯QQ界面
- 仿qq登录界面
- 仿qq界面
- 仿qq登陆界面
- android 仿QQ界面
- 仿qq聊天界面
- Fragment仿qq界面
- JavaSwing仿QQ实现智能对话
- ListView仿QQ群聊天
- 循序渐进实现仿QQ界面
- 仿QQ界面制作 1
- android-仿QQ界面布局
- 高仿QQ(登录界面)
- 高仿QQ(主界面)
- 图书管理系统图书信息界面
- 南阳ACM
- 世界观随想
- spring 配置druid数据源
- 训练29-HTML 为文本输入框设定预定值
- ListView仿QQ对话界面
- 数据挖掘初入门--matlab入门
- 训练30-HTML 添加表单
- Abbyy Cup 2.0
- 一、JSP基本语法
- 00:00:00计时器
- Spring 继承quartz定时器
- Spring aop事务代理对象通过TransactionInterceptor处理目标方法事务过程,cglib方式
- tomcat启动出现Preparing launch delegate的可能原因之一