ListView仿QQ对话界面

本人一直忙于做项目,以至于没有时间整理自己的博客,近来偷得半日闲,特来装饰 (充实)一下自己的空间。微笑

首先上图:

下面进入正题:

一、辅助类准备

         

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(" ");
}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_t_y_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值