书接昨天,设计分左右布局的聊天界面,需要添加一个右边的listview,与左边的十分相似;添加表情,需要在原布局下添加一个GridView,并且写一个表情的布局文件,最后写一个表情的适配器ExpressionAdapter。
public class ExpressionAdapter extends BaseAdapter {
private int[] mData = {R.mipmap.eca,R.mipmap.ecb,R.mipmap.ecc,R.mipmap.ecd,R.mipmap.ece,R.mipmap.ecf,
R.mipmap.ecg,R.mipmap.ech,R.mipmap.eci, R.mipmap.ecj,R.mipmap.eck,R.mipmap.ecl,R.mipmap.ecm,
R.mipmap.ecn,R.mipmap.eco,R.mipmap.ecp,R.mipmap.ecq,R.mipmap.ecr,R.mipmap.ecs,R.mipmap.ect,
R.mipmap.ecu,R.mipmap.ecv,R.mipmap.ecw,R.mipmap.ecx,R.mipmap.ecy,R.mipmap.ecz} ;
private LayoutInflater mInflater;
public ExpressionAdapter(LayoutInflater layoutInflater) {
this.mInflater = layoutInflater;
}
@Override
public int getCount() {
return mData.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ViewHolder vh = null;
if (convertView == null){
convertView = mInflater.inflate(R.layout.item_image,null);
vh = new ViewHolder();
vh.imageview = (ImageView) convertView.findViewById(R.id.imageview_ex);
convertView.setTag(vh);
}else{
vh = (ViewHolder) convertView.getTag();
vh.imageview.setImageResource(mData[position]);
}
return convertView;
}
class ViewHolder{
ImageView imageview;
}
}
还需要在model中添加一个全局变量type,以区别左右的类型。
public class MessageAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<ChatMessage> mData;
private Html.ImageGetter mImageGetter;
private SimpleDateFormat mFormat;
public static final int MESSAGE_LEFT = 0;
public static final int MESSAGE_RIGHT = 1;
public static final int MAX_TYPE = 2;
public MessageAdapter(LayoutInflater mInflater, List<ChatMessage> mData, Html.ImageGetter mImageGetter) {
this.mInflater = mInflater;
this.mData = mData;
this.mImageGetter = mImageGetter;
mFormat = new SimpleDateFormat("EEE HH:mm");
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return MAX_TYPE;
}
@Override
public int getItemViewType(int position) {
return mData.get(position).getType();
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ViewHolder vh = null;
ViewHolderRight vhRight = null;
int type = getItemViewType(position);
if (convertView == null){
switch (type){
case MESSAGE_LEFT:
convertView = mInflater.inflate(R.layout.item_message,null);
vh = new ViewHolder();
vh.imageview_head = (ImageView) convertView.findViewById(R.id.image_head);
vh.textview_time = (TextView) convertView.findViewById(R.id.textview_time);
vh.textview_title = (TextView) convertView.findViewById(R.id.textview_title );
vh.textview_nickname = (TextView) convertView.findViewById(R.id.textview_nickname);
vh.textview_message = (TextView) convertView.findViewById(R.id.textview_message);
convertView.setTag(vh);
break;
case MESSAGE_RIGHT:
convertView = mInflater.inflate(R.layout.item_message_right,null);
vhRight = new ViewHolderRight();
vhRight.imageview_head = (ImageView) convertView.findViewById(R.id.image_head);
vhRight.textview_time = (TextView) convertView.findViewById(R.id.textview_time);
vhRight.textview_title = (TextView) convertView.findViewById(R.id.textview_title );
vhRight.textview_nickname = (TextView) convertView.findViewById(R.id.textview_nickname);
vhRight.textview_message = (TextView) convertView.findViewById(R.id.textview_message);
convertView.setTag(vhRight);
break;
default:
break;
}
}
ChatMessage msg = mData.get(position);
switch (type){
case MESSAGE_LEFT:
vh = (ViewHolder) convertView.getTag();
vh.imageview_head.setImageResource(msg.getImageHead());
vh.textview_title.setText(msg.getTitle());
vh.textview_nickname.setText(msg.getNickname());
Spanned spanned = Html.fromHtml(msg.getTextMessage(),mImageGetter,null);
vh.textview_message.setText(spanned);
String time = mFormat.format(new Date(msg.getTime()));
vh.textview_time.setText(time);
break;
case MESSAGE_RIGHT:
vhRight = (ViewHolderRight) convertView.getTag();
vhRight.imageview_head.setImageResource(msg.getImageHead());
vhRight.textview_title.setText(msg.getTitle());
vhRight.textview_nickname.setText(msg.getNickname());
Spanned spanned1 = Html.fromHtml(msg.getTextMessage(),mImageGetter,null);
vhRight.textview_message.setText(spanned1);
String time1 = mFormat.format(new Date(msg.getTime()));
vhRight.textview_time.setText(time1);
break;
default:
break;
}
// vh.textview_message.setText(Html.fromHtml(msg.getTextMessage(), mImageGetter, null));
// vh.textview_time.setText("时间"+msg.getTime());
return convertView;
}
class ViewHolder{
ImageView imageview_head;
TextView textview_title;
TextView textview_nickname;
TextView textview_time;
TextView textview_message;
}
class ViewHolderRight{
ImageView imageview_head;
TextView textview_title;
TextView textview_nickname;
TextView textview_time;
TextView textview_message;
}
}
public class MainActivity extends Activity implements View.OnClickListener{
private EditText mEditTextContent;
private ImageView mImageView;
private Html.ImageGetter mImageGetter;
private List<ChatMessage> mData;
private ListView mListView;
private Button mButtonSendLeft;
private Button mButtonSendRight;
private MessageAdapter mAdapter;
private GridView mGridView;
private ExpressionAdapter mExpressionAdapter;
private String [] mImage = {"eca","ecb","ecc","ecd","ece","ecf","ecg","ech","eci","ecj","eck",
"ecl","ecm","ecn","eco","ecp","ecq","ecr","ecs","ect","ecu","ecv","ecw","ecx","ecy","ecz",};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditTextContent = (EditText) findViewById(R.id.edittext);
mImageView = (ImageView) findViewById(R.id.imageview);
mButtonSendLeft = (Button) findViewById(R.id.button_left);
mButtonSendRight = (Button) findViewById(R.id.button_right);
mListView = (ListView) findViewById(R.id.listview);
mGridView = (GridView) findViewById(R.id.gridview);
mImageView.setOnClickListener(this);
mButtonSendLeft.setOnClickListener(this);
mButtonSendRight.setOnClickListener(this);
mImageGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable drawable = null;
if (source!=null){
Class clazz = R.mipmap.class;
try {
Field field = clazz.getDeclaredField(source);
int sourceId = field.getInt(clazz);
drawable = getResources().getDrawable(sourceId);
drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}else{
drawable = getResources().getDrawable(R.mipmap.ic_launcher);
drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
}
return drawable;
}
};
mData = new ArrayList<>();
mAdapter = new MessageAdapter(getLayoutInflater(),mData,mImageGetter);
mListView.setAdapter(mAdapter);
mExpressionAdapter = new ExpressionAdapter(getLayoutInflater());
mGridView.setAdapter(mExpressionAdapter);
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Spanned spanned = Html.fromHtml("<img src='"+mImage[position]+"'/>",mImageGetter,null);
mEditTextContent.getText().insert(mEditTextContent.getSelectionStart(),spanned);//将表情插入到光标位置
}
});
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.imageview:
if (mGridView.getVisibility() == View.VISIBLE){
mGridView.setVisibility(View.GONE);
}else{
mGridView.setVisibility(View.VISIBLE);
}
break;
case R.id.button_left:
ChatMessage message = new ChatMessage();
message.setImageHead(R.mipmap.ic_launcher);
message.setTitle("营长");
message.setNickname("小明");
message.setTime(System.currentTimeMillis());
message.setType(MessageAdapter.MESSAGE_LEFT);
message.setTextMessage(filterHtml(Html.toHtml(mEditTextContent.getText())));
Log.d("设置的内容",Html.toHtml(mEditTextContent.getText()));
mData.add(message);//将生成的信息添加到mData中去
mAdapter.notifyDataSetChanged();//刷新listview
mListView.setSelection(mData.size() - 1);//将信息拉倒最后一条
mEditTextContent.setText("");//输入框清空
break;
case R.id.button_right:
ChatMessage message2 = new ChatMessage();
message2.setImageHead(R.mipmap.ic_launcher);
message2.setTitle("营长");
message2.setNickname("小明");
message2.setTime(System.currentTimeMillis());
message2.setType(MessageAdapter.MESSAGE_RIGHT);
message2.setTextMessage(filterHtml(Html.toHtml(mEditTextContent.getText())));
Log.d("设置的内容",Html.toHtml(mEditTextContent.getText()));
mData.add(message2);//将生成的信息添加到mData中去
mAdapter.notifyDataSetChanged();//刷新listview
mListView.setSelection(mData.size() - 1);//将信息拉倒最后一条
mEditTextContent.setText("");//输入框清空
break;
default:
break;
}
}
private String filterHtml(String str) {
str = str.replaceAll("<(?!br|img)[^>]+>","").trim();//正则表达式
return str;
}