【安卓笔记】气泡式ListView

来源:互联网 发布:适合程序员的机械键盘 编辑:程序博客网 时间:2024/05/18 00:51

要想实现气泡效果,我们需要找到气泡背景的9.png图片,大家可以从qq微信等apk包中提取。

实现步骤:

1.编写布局文件。

每个条目的布局
activity_chat_singlemessage.xml
[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content" >  
  5.     <LinearLayout  
  6.         android:id="@+id/singleMessageContainer"  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="wrap_content" >  
  9.         <TextView  
  10.             android:id="@+id/singleMessage"  
  11.             android:layout_width="wrap_content"  
  12.             android:layout_height="wrap_content"  
  13.             android:layout_gravity="center"  
  14.             android:layout_margin="5dip"  
  15.             android:background="@drawable/bubble_b"  
  16.             android:paddingLeft="10dip"  
  17.             android:textSize="18sp"  
  18.             android:text="Hello bubbles!"  
  19.             android:textColor="@android:color/primary_text_light" />  
  20.     </LinearLayout>  
  21. </LinearLayout>  
界面布局:
activity_main.xml
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.     <ListView  
  7.         android:id="@+id/listView1"  
  8.         android:divider="@null"  
  9.         android:listSelector="@android:color/transparent"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:layout_marginBottom="80dp" >  
  13.     </ListView>  
  14.     <RelativeLayout  
  15.         android:id="@+id/form"  
  16.         android:layout_width="fill_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_alignParentBottom="true"  
  19.         android:layout_alignParentLeft="true"  
  20.         android:orientation="vertical" >  
  21.         <EditText  
  22.             android:id="@+id/chatText"  
  23.             android:layout_width="wrap_content"  
  24.             android:layout_height="wrap_content"  
  25.             android:layout_alignParentBottom="true"  
  26.             android:layout_alignParentLeft="true"  
  27.             android:layout_alignParentStart="true"  
  28.             android:layout_toLeftOf="@+id/buttonSend"  
  29.             android:ems="10"  
  30.             android:inputType="textMultiLine" />  
  31.         <Button  
  32.             android:id="@+id/buttonSend"  
  33.             android:layout_width="wrap_content"  
  34.             android:layout_height="wrap_content"  
  35.             android:layout_alignBottom="@+id/chatText"  
  36.             android:layout_alignParentEnd="true"  
  37.             android:layout_alignParentRight="true"  
  38.             android:text="Send" />  
  39.     </RelativeLayout>  
  40. </RelativeLayout>  
2.编写业务数据类:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.chatbubble;  
  2. public class ChatMessage {//代表每条消息  
  3.     public boolean left;//是否在左边  
  4.     public String message;  
  5.       
  6.     public ChatMessage(boolean left, String message)  
  7.     {  
  8.         super();  
  9.         this.left = left;  
  10.         this.message = message;  
  11.     }  
  12. }  

3.编写适配器类

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.chatbubble;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import android.content.Context;  
  5. import android.view.Gravity;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.ArrayAdapter;  
  10. import android.widget.LinearLayout;  
  11. import android.widget.TextView;  
  12. public class ChatArrayAdapter extends ArrayAdapter<ChatMessage>  
  13. {  
  14.     private TextView chatText;  
  15.     private LinearLayout container;  
  16.     private List<ChatMessage> chatData = new ArrayList<>();  
  17.       
  18.     @Override  
  19.     public void add(ChatMessage object)  
  20.     {  
  21.         chatData.add(object);  
  22.         super.add(object);  
  23.     }  
  24.       
  25.       
  26.     @Override  
  27.     public int getCount()  
  28.     {  
  29.         return chatData.size();  
  30.     }  
  31.       
  32.     @Override  
  33.     public ChatMessage getItem(int position)  
  34.     {  
  35.         return chatData.get(position);  
  36.     }  
  37.       
  38.     @Override  
  39.     public View getView(int position, View convertView, ViewGroup parent)  
  40.     {  
  41.         if(convertView == null)  
  42.         {  
  43.             LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  44.             convertView = inflater.inflate(R.layout.activity_chat_singlemessage,parent, false);  
  45.         }  
  46.         chatText = (TextView) convertView.findViewById(R.id.singleMessage);  
  47.         container = (LinearLayout) convertView.findViewById(R.id.singleMessageContainer);  
  48.           
  49.         ChatMessage  msg = getItem(position);  
  50.         chatText.setText(msg.message);  
  51.           
  52.         /*根据msg的内部left标识来判定应该选择什么背景,和位置(左/右)*/  
  53.         chatText.setBackgroundResource(msg.left ? R.drawable.bubble_b : R.drawable.bubble_a);  
  54.         container.setGravity(msg.left ? Gravity.LEFT : Gravity.RIGHT);  
  55.           
  56.         return convertView;  
  57.     }  
  58.       
  59.       
  60.     public ChatArrayAdapter(Context context, int resource)  
  61.     {  
  62.         super(context, resource);  
  63.     }  
  64. }  
4.编写主界面的代码:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.chatbubble;  
  2. import android.app.Activity;  
  3. import android.database.DataSetObserver;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.AbsListView;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10. import android.widget.ListView;  
  11. public class MainActivity extends Activity  
  12. {  
  13.     private ListView lv;  
  14.     private Button but;  
  15.     private EditText et;  
  16.     private ChatArrayAdapter adapter;  
  17.     private boolean side = false;  
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState)  
  20.     {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.         lv = (ListView) findViewById(R.id.listView1);  
  24.         but = (Button) findViewById(R.id.buttonSend);  
  25.         et = (EditText) findViewById(R.id.chatText);  
  26.         adapter = new ChatArrayAdapter(this,  
  27.                 R.layout.activity_chat_singlemessage);  
  28.         lv.setAdapter(adapter);  
  29.         but.setOnClickListener(new OnClickListener()  
  30.         {  
  31.             @Override  
  32.             public void onClick(View v)  
  33.             {  
  34.                 sendChatMessage();//发送消息  
  35.             }  
  36.         });  
  37.           
  38.         lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);  
  39.         //注册观察者,数据改变时滑到底部  
  40.         adapter.registerDataSetObserver(new DataSetObserver()  
  41.         {  
  42.             @Override  
  43.             public void onChanged()  
  44.             {  
  45.                 super.onChanged();  
  46.                 lv.setSelection(adapter.getCount() - 1);  
  47.             }  
  48.         });  
  49.     }  
  50.     private boolean sendChatMessage()  
  51.     {  
  52.         /*add方法内部会调用notifyDataSetChanged方法,故我们不需要手动调用!*/  
  53.         adapter.add(new ChatMessage(side, et.getText().toString()));  
  54.         /*清空数据*/  
  55.         et.setText("");  
  56.         side = !side;  
  57.         return true;  
  58.     }  
  59. }  

效果完成!


0 0
原创粉丝点击