1、listview的Adapter使用两套布局实现消息模块左右两边消息的显示布局遇到的问题,项目开始的时候想使用两套布局文件分别管理左右消息的展示,但是在使用过程中遇到一些问题。在Adapter中使用ViewHolder的时候复用控件就没法再次判断使用哪种布局了,错误代码示例:
/**
* 这样是错误的写法(等待大牛解决这个使用两个布局的正确办法) *
* @param position
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
boolean msgtype = messageBeans.get(position).issendmsg();
if (convertView == null) {
if (!msgtype) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.chatting_item_msg_text_left, null);
} else {
convertView = LayoutInflater.from(mContext).inflate(R.layout.chatting_item_msg_text_right, null);
}
viewHolder = new ViewHolder();
viewHolder.username = (TextView) convertView.findViewById(R.id.username_TV);
viewHolder.msg = (TextView) convertView.findViewById(R.id.msg_TV);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.username.setText(messageBeans.get(position).getUsername());
viewHolder.msg.setText(messageBeans.get(position).getMsg());
return convertView;
}
private class ViewHolder {
private TextView username;
private TextView msg;
}
2、没办法只能使用大众常用的方法了(想使用其他办法结果没走通。。。) 常用做法是:使用一个布局,咋里边布局左右消息的展示,在Adapter中通过消息来源类别判断是显示还是隐藏左边或右边的布局,
if (!msgtype) {
viewHolder.left_ll.setVisibility(View.VISIBLE);
viewHolder.right_ll.setVisibility(View.GONE);
viewHolder.msg_left.setText(messageBeans.get(position).getMsg());
} else {
viewHolder.left_ll.setVisibility(View.GONE);
viewHolder.right_ll.setVisibility(View.VISIBLE);
viewHolder.msg_right.setText(messageBeans.get(position).getMsg());
}
下边是主要代码片段:
/**
* 遗留问题 使用viewholder时候就不行 不使用可以 但是这样效率不高 等待高手解惑。。。
* 解决办法 :暂时使用一个布局使用gone和visable判断显示
*
* @param position
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
boolean msgtype = messageBeans.get(position).issendmsg();
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.chatting_item_msg_text, null);
viewHolder.msg_left = (TextView) convertView.findViewById(R.id.msg_left_TV);
viewHolder.msg_right = (TextView) convertView.findViewById(R.id.msg_right_TV);
viewHolder.left_ll = (RelativeLayout) convertView.findViewById(R.id.left_msg_ll);
viewHolder.right_ll = (RelativeLayout) convertView.findViewById(R.id.right_msg_ll);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (!msgtype) {
viewHolder.left_ll.setVisibility(View.VISIBLE);
viewHolder.right_ll.setVisibility(View.GONE);
viewHolder.msg_left.setText(messageBeans.get(position).getMsg());
} else {
viewHolder.left_ll.setVisibility(View.GONE);
viewHolder.right_ll.setVisibility(View.VISIBLE);
viewHolder.msg_right.setText(messageBeans.get(position).getMsg());
}
return convertView;
}
private class ViewHolder {
private RelativeLayout left_ll;
private RelativeLayout right_ll;
private TextView msg_left;
private TextView msg_right;
}
下边是消息的xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/left_msg_ll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:orientation="horizontal">
<ImageView
android:id="@+id/imageView1"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_gravity="center"
android:src="@mipmap/third_guide_head_1" />
<LinearLayout
android:id="@+id/linearLayout1"
style="@style/chating_msg_receive_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_gravity="center"
android:layout_toEndOf="@+id/imageView1"
android:orientation="vertical">
<TextView
android:id="@+id/msg_left_TV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="左边消息" />
</LinearLayout>
</RelativeLayout>
<RelativeLayout
android:id="@+id/right_msg_ll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/left_msg_ll"
android:layout_alignParentEnd="true">
<LinearLayout
android:id="@+id/linearLayout"
style="@style/chating_msg_send_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_toStartOf="@+id/imageView2"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/msg_right_TV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="右边消息" />
</LinearLayout>
<ImageView
android:id="@+id/imageView2"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_gravity="center"
android:src="@mipmap/third_guide_head_2" />
</RelativeLayout>
</RelativeLayout>