从网上找到一个仿微信聊天的例子。加载完列表后,点击发送后可以将当前输入的显示在列表上。我在自己的测试代码里把Adapter 改了一点:就是把LIST里的对象换了一下。然后在点击发送后。adapter.notifyDataSetChanged 代码执行无异常。但程序随后就会提示。isn't responding do you want to close? 求大侠给指点一下!
原例Adapter
加载及发送消息代码
-----------------------------------------------------------------------------------------------------
我改后的Adapter
加载及单独发送消息
发送消息
原例Adapter
public class ChatMsgViewAdapter2 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;
private MediaPlayer mMediaPlayer = new MediaPlayer();
public ChatMsgViewAdapter2(Context context, List<ChatMsgEntity> coll) {
ctx = context;
this.coll = coll;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return coll.size();
}
public Object getItem(int position) {
return coll.get(position);
}
public long getItemId(int position) {
return position;
}
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;
}
}
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
}
public View getView(int position, View convertView, ViewGroup parent) {
final 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.tvTime = (TextView) convertView
.findViewById(R.id.tv_time);
viewHolder.isComMsg = isComMsg;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvSendTime.setText(entity.getDate());
if (entity.getText().contains(".amr")) {
viewHolder.tvContent.setText("");
viewHolder.tvContent.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.chatto_voice_playing, 0);
viewHolder.tvTime.setText(entity.getTime());
} else {
viewHolder.tvContent.setText(entity.getText());
viewHolder.tvContent.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
viewHolder.tvTime.setText("");
}
viewHolder.tvContent.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (entity.getText().contains(".amr")) {
playMusic(android.os.Environment.getExternalStorageDirectory()+"/"+entity.getText()) ;
}
}
});
viewHolder.tvUserName.setText(entity.getName());
return convertView;
}
static class ViewHolder {
public TextView tvSendTime;
public TextView tvUserName;
public TextView tvContent;
public TextView tvTime;
public boolean isComMsg = true;
}
/**
* @Description
* @param name
*/
private void playMusic(String name) {
try {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
}
mMediaPlayer.reset();
mMediaPlayer.setDataSource(name);
mMediaPlayer.prepare();
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private void stop() {
}
}
加载及发送消息代码
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 ChatMsgViewAdapter2(this, mDataArrays);
mListView.setAdapter(mAdapter);
ChatMsgEntity entity = new ChatMsgEntity();
entity.setDate(getDate());
entity.setName("高富帅");
entity.setMsgType(false);
entity.setText(contString);
mDataArrays.add(entity);
mAdapter.notifyDataSetChanged();
mEditTextContent.setText("");
mListView.setSelection(mListView.getCount() - 1);
-----------------------------------------------------------------------------------------------------
我改后的Adapter
package net.telehealth.app.adapter;
import java.util.List;
import net.telehealth.app.R;
import net.telehealth.app.bean.ConsultContenInfo;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
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<ConsultContenInfo> coll;
private Context ctx;
private LayoutInflater mInflater;
private MediaPlayer mMediaPlayer = new MediaPlayer();
public ChatMsgViewAdapter(Context context, List<ConsultContenInfo> coll) {
ctx = context;
this.coll = coll;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return coll.size();
}
public Object getItem(int position) {
return coll.get(position);
}
public long getItemId(int position) {
return position;
}
public int getItemViewType(int position) {
// TODO Auto-generated method stub
ConsultContenInfo entity = coll.get(position);
if (entity.getDirection().equals("1")) {
return IMsgViewType.IMVT_COM_MSG;
} else {
return IMsgViewType.IMVT_TO_MSG;
}
}
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
}
public View getView(int position, View convertView, ViewGroup parent) {
final ConsultContenInfo entity = coll.get(position);
boolean isComMsg = true;
if (entity.getDirection().equals("1"))
{
isComMsg=true;
}else {
isComMsg=false;
}
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.tvTime = (TextView) convertView
.findViewById(R.id.tv_time);
viewHolder.isComMsg = isComMsg;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvSendTime.setText(entity.getMsgtime());
//语音
if (entity.getMsgtype().equals("2")) {
viewHolder.tvContent.setText("");
viewHolder.tvContent.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.chatto_voice_playing, 0);
viewHolder.tvTime.setText(entity.getMsgtime());
} else {
viewHolder.tvContent.setText(entity.getMsgtext());
viewHolder.tvContent.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
viewHolder.tvTime.setText("");
}
viewHolder.tvContent.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (entity.getMsgtype().equals("2")) {
playMusic(android.os.Environment.getExternalStorageDirectory()+"/"+entity.getMsgaudio()) ;
}
}
});
if(entity.getDirection().equals("0")) {
viewHolder.tvUserName.setText(entity.getDoctor());
}else {
viewHolder.tvUserName.setText(entity.getExpert());
}
return convertView;
}
static class ViewHolder {
public TextView tvSendTime;
public TextView tvUserName;
public TextView tvContent;
public TextView tvTime;
public boolean isComMsg = true;
}
private void playMusic(String name) {
try {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
}
mMediaPlayer.reset();
mMediaPlayer.setDataSource(name);
mMediaPlayer.prepare();
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private void stop() {}
}
加载及单独发送消息
ConsultContenInfo entity1 = new ConsultContenInfo();
entity1.setMsgtime("2015-08-01 10:45:33");
entity1.setDoctor("测试A");
entity1.setMsgtype("0");
entity1.setMsgtext("我是A,我要咨询问题");
entity1.setDirection("0");
ConsultContenInfo entity2 = new ConsultContenInfo();
entity2.setMsgtime("2015-08-01 10:45:44");
entity2.setExpert("测试B");
entity2.setMsgtype("0");
entity2.setMsgtext("我是B,我可以解答问题");
entity2.setDirection("1");
mConsultArrays.add(entity2);
mConsultAdapter = new ChatMsgViewAdapter(this, mConsultArrays);
mListView.setAdapter(mConsultAdapter);
发送消息
String contString = mEditTextContent.getText().toString();
if (contString.length() > 0) {
ConsultContenInfo entity = new ConsultContenInfo();
entity.setMsgtime(getDate());
if (mIdentity.equals("0"))
entity.setDoctor(mSendDoctorName);
entity.setDirection("0");
entity.setMsgtext(contString);
mConsultArrays.add(entity);
mConsultAdapter.notifyDataSetChanged();
mEditTextContent.setText("");
mListView.setSelection(mListView.getCount() - 1);
break;
}