listview的Adapter使用布局实现消息模块左右两边消息的显示布局遇到的问题

本文探讨了在Android开发中,如何优化ListView中消息显示的布局。面对左右消息布局的需求,介绍了尝试使用两套布局文件但遇到ViewHolder复用问题的挑战,并最终采用单一布局结合视图可见性调整的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值