仿微信-界面动画(9)--ListView有不同类别Item

来源:互联网 发布:深圳爱玩网络 编辑:程序博客网 时间:2024/05/01 20:05

这次主要讲述的是如何实现微信聊天界面~
难点~不同种类的Item的组合
实现效果如下:
效果图

只是简单的界面设计,因此~无法实现真正的对话~切对话内容是源代码中明确写出的,这里主要是讲解的是不同Item的ListView的实现;

涉及到了,chatmsg实体,适配器等等~

根据类型的不同~分为两种R.layout.chatting_item_msg_text_left和R.layout.chatting_item_msg_text_right

示意图如下:
chatting_item_msg_text_right
chatting_item_msg_text_left
效果显而易见,看代码吧~

ChatActivity源码

package cn.buaa.myweixin;import java.util.ArrayList;import java.util.Calendar;import java.util.List;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;public class ChatActivity extends Activity implements OnClickListener{    /** Called when the activity is first created. */    private Button mBtnSend;    private Button mBtnBack;    private EditText mEditTextContent;    private ListView mListView;    private ChatMsgViewAdapter mAdapter;    private List<ChatMsgEntity> mDataArrays = new ArrayList<ChatMsgEntity>();    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.chat_xiaohei);        //启动activity时不自动弹出软键盘        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);         initView();        initData();    }    public void initView()    {        mListView = (ListView) findViewById(R.id.listview);        mBtnSend = (Button) findViewById(R.id.btn_send);        mBtnSend.setOnClickListener(this);        mBtnBack = (Button) findViewById(R.id.btn_back);        mBtnBack.setOnClickListener(this);        mEditTextContent = (EditText) findViewById(R.id.et_sendmessage);    }    private String[]msgArray = new String[]{"你好啊,我是小黑,你呢?", "我是人马,很高兴认识你", "我也是", "一起玩会游戏?",                                             "可以啊,但是我好久没玩了,可能比较坑", "没事啊,我也有点不会玩的",                                            "不解释,哈哈哈哈", "gogogo~~~",};    private String[]dataArray = new String[]{"2016-09-01 18:00", "2016-09-01 18:10",                                             "2016-09-01 18:11", "2016-09-01 18:20",                                             "2016-09-01 18:30", "2016-09-01 18:35",                                             "2016-09-01 18:40", "2016-09-01 18:50"};     private final static int COUNT = 8;    public void initData()    {        for(int i = 0; i < COUNT; i++)        {            ChatMsgEntity entity = new ChatMsgEntity();            entity.setDate(dataArray[i]);            if (i % 2 == 0)            {                entity.setName("小黑");                entity.setMsgType(true);            }else{                entity.setName("人马");                entity.setMsgType(false);            }            entity.setText(msgArray[i]);            mDataArrays.add(entity);        }        mAdapter = new ChatMsgViewAdapter(this, mDataArrays);        mListView.setAdapter(mAdapter);    }    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        switch(v.getId())        {        case R.id.btn_send:            send();            break;        case R.id.btn_back:            finish();            break;        }    }    private void send()    {        String contString = mEditTextContent.getText().toString();        if (contString.length() > 0)        {            ChatMsgEntity entity = new ChatMsgEntity();            entity.setDate(getDate());            entity.setName("人马");      //我是人马,都是以人马的口吻进行的发送            entity.setMsgType(false);            entity.setText(contString);            mDataArrays.add(entity);            mAdapter.notifyDataSetChanged(); //提示适配器更新            mEditTextContent.setText(""); //清空editText            mListView.setSelection(mListView.getCount() - 1);        }    }    private String getDate() {        Calendar c = Calendar.getInstance();        String year = String.valueOf(c.get(Calendar.YEAR));        String month = String.valueOf(c.get(Calendar.MONTH) + 1);        String day = String.valueOf(c.get(Calendar.DAY_OF_MONTH));        String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY));        String mins = String.valueOf(c.get(Calendar.MINUTE));        StringBuffer sbBuffer = new StringBuffer();        sbBuffer.append(year + "-" + month + "-" + day + " " + hour + ":" + mins);         return sbBuffer.toString();    }    public void head_xiaohei(View v) {     //标题栏 返回按钮        Intent intent = new Intent (ChatActivity.this,InfoXiaohei.class);                   startActivity(intent);        } }

ChatMsgViewAdapter源码

package cn.buaa.myweixin;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.List;public class ChatMsgViewAdapter extends BaseAdapter {    public static interface IMsgViewType    {        int IMVT_COM_MSG = 0;        int IMVT_TO_MSG = 1;    }    private static final String TAG = ChatMsgViewAdapter.class.getSimpleName();    private List<ChatMsgEntity> coll;    private Context ctx;    private LayoutInflater mInflater;    public ChatMsgViewAdapter(Context context, List<ChatMsgEntity> coll) {        ctx = context;        this.coll = coll;        mInflater = LayoutInflater.from(context);    }    @Override    public int getCount() {        return coll.size();    }    @Override    public Object getItem(int position) {        return coll.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public int getItemViewType(int position) {        // TODO Auto-generated method stub        ChatMsgEntity entity = coll.get(position);        if (entity.getMsgType())        {            return IMsgViewType.IMVT_COM_MSG;        }else{            return IMsgViewType.IMVT_TO_MSG;        }    }    @Override    public int getViewTypeCount() {        // TODO Auto-generated method stub        return 2;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ChatMsgEntity entity = coll.get(position);        boolean isComMsg = entity.getMsgType();        ViewHolder viewHolder = null;           if (convertView == null)        {              if (isComMsg)              {                  convertView = mInflater.inflate(R.layout.chatting_item_msg_text_left, null);              }else{                  convertView = mInflater.inflate(R.layout.chatting_item_msg_text_right, null);              }              viewHolder = new ViewHolder();              viewHolder.tvSendTime = (TextView) convertView.findViewById(R.id.tv_sendtime);              viewHolder.tvUserName = (TextView) convertView.findViewById(R.id.tv_username);              viewHolder.tvContent = (TextView) convertView.findViewById(R.id.tv_chatcontent);              viewHolder.isComMsg = isComMsg;              convertView.setTag(viewHolder);        }else{            viewHolder = (ViewHolder) convertView.getTag();        }        viewHolder.tvSendTime.setText(entity.getDate());        viewHolder.tvUserName.setText(entity.getName());        viewHolder.tvContent.setText(entity.getText());        return convertView;    }    static class ViewHolder {         public TextView tvSendTime;        public TextView tvUserName;        public TextView tvContent;        public boolean isComMsg = true;    }}

ChatMsgEntity源码

package cn.buaa.myweixin;public class ChatMsgEntity {    private static final String TAG = ChatMsgEntity.class.getSimpleName();    private String name;    private String date;    private String text;    private boolean isComMeg = true;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getDate() {        return date;    }    public void setDate(String date) {        this.date = date;    }    public String getText() {        return text;    }    public void setText(String text) {        this.text = text;    }    public boolean getMsgType() {        return isComMeg;    }    public void setMsgType(boolean isComMsg) {        isComMeg = isComMsg;    }    public ChatMsgEntity() {    }    public ChatMsgEntity(String name, String date, String text, boolean isComMsg) {        super();        this.name = name;        this.date = date;        this.text = text;        this.isComMeg = isComMsg;    }}

R.layout.chatting_item_msg_text_left

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:orientation="vertical"        android:padding="6dp">        <LinearLayout            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:orientation="vertical"             android:gravity="center_horizontal">            <TextView                android:id="@+id/tv_sendtime"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                style="@style/chat_text_date_style"/>        </LinearLayout>        <RelativeLayout            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_marginTop="5dp"            android:layout_marginLeft="5dp" >                <ImageView                    android:id="@+id/iv_userhead"                    android:layout_width="52dp"                   android:layout_height="52dp"                   android:clickable="true"                   android:onClick="head_xiaohei"                   android:layout_alignParentLeft="true"                    android:layout_alignParentTop="true"                    android:background="@drawable/xiaohei"/>                <TextView                 android:id="@+id/tv_chatcontent"                 android:layout_toRightOf="@id/iv_userhead"                android:layout_marginLeft="10dp"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:background="@drawable/chatfrom_bg"                 style="@style/chat_content_date_style"/>                   <TextView                 android:id="@+id/tv_username"                 android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_below="@id/iv_userhead"                android:layout_alignParentLeft="true"                android:layout_toLeftOf="@id/tv_chatcontent"                style="@style/chat_text_name_style"/>        </RelativeLayout></LinearLayout>

R.layout.chatting_item_msg_text_right

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:orientation="vertical"        android:padding="6dp" >        <LinearLayout            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:orientation="vertical"             android:gravity="center_horizontal">            <TextView            android:id="@+id/tv_sendtime"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:padding="2dp"            android:textColor="#ffffff"            android:textSize="12sp"            android:background="#bfbfbf"/>        </LinearLayout>        <RelativeLayout            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_marginTop="5dp"            android:layout_marginRight="5dp" >               <ImageView                android:id="@+id/iv_userhead"                android:layout_width="52dp"               android:layout_height="52dp"               android:focusable="false"                android:layout_alignParentRight="true"                android:layout_alignParentTop="true"                android:background="@drawable/renma"/>                <TextView                 android:id="@+id/tv_chatcontent"                 android:layout_toLeftOf="@id/iv_userhead"                android:layout_marginRight="10dp"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:background="@drawable/chatto_bg"                 android:textSize="15sp"                android:textColor="#ff000000"                android:gravity="left|center"                android:minHeight="50dp"                 android:lineSpacingExtra="2dp"                android:clickable="true"                android:focusable="true"/>                   <TextView                 android:id="@+id/tv_username"                 android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_below="@id/iv_userhead"                android:layout_alignParentRight="true"                android:layout_toRightOf="@id/tv_chatcontent"                android:textSize="15sp"                android:gravity="center"                android:textColor="#818181"/>        </RelativeLayout></LinearLayout>

R.layout.chat_xiaohei

<?xml version="1.0" encoding="utf-8"?><RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:background="@drawable/chat_bg_default" >    <RelativeLayout         android:id="@+id/rl_layout"            android:layout_width="fill_parent"            android:layout_height="45dp"            android:background="@drawable/title_bar"            android:gravity="center_vertical"  >             <Button            android:id="@+id/btn_back"            android:layout_width="70dp"            android:layout_height="wrap_content"            android:layout_centerVertical="true"            android:text="返回"            android:textSize="14sp"            android:textColor="#fff"            android:onClick="chat_back"            android:background="@drawable/title_btn_back"            />                <TextView                android:layout_width="wrap_content"                 android:layout_height="wrap_content"                 android:text="小黑"                android:layout_centerInParent="true"                android:textSize="20sp"                     android:textColor="#ffffff" />             <ImageButton                 android:id="@+id/right_btn"                android:layout_width="67dp"                 android:layout_height="wrap_content"                android:layout_alignParentRight="true"                 android:layout_centerVertical="true"                android:layout_marginRight="5dp"                android:src="@drawable/mm_title_btn_contact_normal"                android:background="@drawable/title_btn_right"                />              </RelativeLayout>   <RelativeLayout        android:id="@+id/rl_bottom"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:background="@drawable/chat_footer_bg" >        <Button        android:id="@+id/btn_send"        android:layout_width="60dp"        android:layout_height="40dp"        android:layout_alignParentRight="true"        android:layout_marginRight="10dp"        android:layout_centerVertical="true"        android:text="发送"        android:background="@drawable/chat_send_btn" />        <EditText        android:id="@+id/et_sendmessage"        android:layout_width="fill_parent"        android:layout_height="40dp"        android:layout_toLeftOf="@id/btn_send"        android:layout_marginLeft="10dp"        android:layout_marginRight="10dp"        android:background="@drawable/login_edit_normal"        android:layout_centerVertical="true"        android:singleLine="true"        android:textSize="18sp"/>    </RelativeLayout>    <ListView    android:id="@+id/listview"    android:layout_below="@id/rl_layout"    android:layout_above="@id/rl_bottom"    android:layout_width="fill_parent"    android:layout_height="fill_parent"        android:divider="@null"    android:dividerHeight="5dp"    android:stackFromBottom="true"    android:scrollbarStyle="outsideOverlay"     android:cacheColorHint="#0000"/></RelativeLayout>

直接上代码了,看了之前的实例的小伙伴们应该都看的很清楚啦~就不赘述了~,谢谢~

1 0
原创粉丝点击