先贴出错误
android.view.InflateException: Binary XML file line #32: Error inflating class TextView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at com.jack.jianyu.ui.adapter.ChatMessageAdapter.getView(ChatMessageAdapter.java:67)
然后这个是ChatMessageAdapter
public class ChatMessageAdapter extends BaseAdapter {
private Context mContext = null;
private List<ChatMessageBean> messageBeans = null;
private LayoutInflater mInflater = null;
public ChatMessageAdapter(Context context, List<ChatMessageBean> mDataList) {
this.mContext = context;
this.messageBeans = mDataList;
mInflater = LayoutInflater.from(context);
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
ChatMessageBean chatMessageBean = messageBeans.get(position);
if (chatMessageBean.getType() == ChatMessageBean.Type.RECEIVEMSG) {
return 0;
}
return 1;
}
@Override
public int getCount() {
return messageBeans.size();
}
@Override
public Object getItem(int position) {
return messageBeans.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ChatMessageBean chatMessageBean = messageBeans.get(position);
ViewHolder viewHolder = null;
if (convertView == null) {
if (getItemViewType(position) == 0) {
convertView = mInflater.inflate(R.layout.item_chat_receivemsg, parent, false);
viewHolder = new ViewHolder();
viewHolder.mDate = (TextView) convertView
.findViewById(R.id.tv_from_time);
viewHolder.mMsg = (TextView) convertView
.findViewById(R.id.tv_from_content);
} else {
convertView = mInflater.inflate(R.layout.item_chat_sendmsg, parent, false);
viewHolder = new ViewHolder();
viewHolder.mDate = (TextView) convertView
.findViewById(R.id.tv_to_time);
viewHolder.mMsg = (TextView) convertView
.findViewById(R.id.tv_to_content);
}
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 设置数据
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
viewHolder.mDate.setText(df.format(chatMessageBean.getDate()));
viewHolder.mMsg.setText(chatMessageBean.getMsg());
return convertView;
}
public final class ViewHolder {
TextView mDate;
TextView mMsg;
XCRoundImageView mImage;
}
}
简单的说就是个双布局,一个聊天界面
R.layout.item_chat_receivemsg
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"
android:padding="8dp">
<TextView
android:id="@+id/tv_from_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="3dp"
android:text="12:12:12"
android:textColor="@color/textInfo"
android:textSize="10sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:orientation="horizontal">
<com.jack.jianyu.widget.XCRoundImageView
android:id="@+id/image_from_tuling"
style="@style/user_face_image"
android:contentDescription="@null" />
<TextView
android:id="@+id/tv_from_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:background="@drawable/chat_recevie_bg_selector"
android:clickable="true"
android:gravity="center_vertical"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
R.layout.item_chat_sendmsg
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:gravity="right"
android:orientation="vertical"
android:padding="8dp">
<TextView
android:id="@+id/tv_to_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="3dp"
android:text="12:12:12"
android:textColor="@color/textInfo"
android:textSize="10sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_to_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:background="@drawable/chat_send_bg_selector"
android:clickable="true"
android:gravity="center_vertical"
android:textSize="15sp" />
<com.jack.jianyu.widget.XCRoundImageView
android:id="@+id/image_to_tuling"
style="@style/user_face_image"
android:contentDescription="@null" />
</LinearLayout>
</LinearLayout>
这是在解析XML
出现了问题,建议Rebuild
一下刷新XML
布局文件,另外检查一下布局文件中的XCRoundImageView
内是否存在问题。
你的代码我认真看了一下,发现很可能是这个原因导致的错误。
我先来说说你代码的意图,看看对不对:
你是想在聊天界面显示自己接受到的信息和自己发送的信息,但是这些信息的排列是没有规律的。
你的思路使用两个ViewHolder来分别保存接受到的信息和自己发送的信息对应布局文件中的内容,这个想法是没错的。来看看你的这段代码
if (convertView == null) {
if (getItemViewType(position) == 0) {
convertView = mInflater.inflate(R.layout.item_chat_receivemsg, parent, false);
viewHolder = new ViewHolder();
viewHolder.mDate = (TextView) convertView
.findViewById(R.id.tv_from_time);
viewHolder.mMsg = (TextView) convertView
.findViewById(R.id.tv_from_content);
} else {
convertView = mInflater.inflate(R.layout.item_chat_sendmsg, parent, false);
viewHolder = new ViewHolder();
viewHolder.mDate = (TextView) convertView
.findViewById(R.id.tv_to_time);
viewHolder.mMsg = (TextView) convertView
.findViewById(R.id.tv_to_content);
}
convertView.setTag(viewHolder);
}
很明显,你的代码只会保存一个ViewHolder,而且一般情况下保存的是接受信息的ViewHolder,因为if (convertView == null)
里面的代码语句在一开始时只会执行一次。
给你一个解决方案的思路:
用两个convertView和ViewHolder保存分别保存接受到的信息和自己发送的信息
在ChatMessageBean里面添加一个判断是发送信息还是接受信息的字段
在
getView
中根据ChatMessageBean chatMessageBean = messageBeans.get(position);
中的新增的字段判断是发送信息还是接受信息,然后对对应的ViewHolder进行处理并返回对应的convertView