Android adapter.notifyDataSetChanged 后程序崩溃,求解!

来源:互联网 发布:seo怎么优化 编辑:程序博客网 时间:2024/05/17 23:42
从网上找到一个仿微信聊天的例子。加载完列表后,点击发送后可以将当前输入的显示在列表上。我在自己的测试代码里把Adapter 改了一点:就是把LIST里的对象换了一下。然后在点击发送后。adapter.notifyDataSetChanged 代码执行无异常。但程序随后就会提示。isn't responding do you want to close? 求大侠给指点一下!

原例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;
 }

0 0
原创粉丝点击