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了:
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;    }}

这里的chat_left:

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