ListView的优化及显示

最近做一个有聊天界面的应用,从服务器获取数据,显示有问题,如下图

 

这种错误真令人恶心,开始以为是优化代码搞出来的问题,仔细看了下,没问题,估计是缓存的问题,

布局代码如下:

<?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="match_parent"
    android:orientation="vertical" >

    <TableLayout
        android:id="@+id/tl_item_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:padding="3dp"
        android:shrinkColumns="0">

        <TableRow
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="right|top"
             >

            <TextView
                android:id="@+id/tv_item_send"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="50dp"
                android:background="@drawable/conversion_send"
                android:text="ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss疼啊蛋疼啊头也疼啊"
                android:textColor="#000000"
                android:textSize="18sp" />

            <ImageView
                android:id="@+id/iv_item_send"
                android:layout_width="70dp"
                android:layout_height="70dp"
                android:layout_marginRight="10dp"
                android:background="@drawable/account" />

            <ImageView
                android:id="@+id/iv_sendAvatar"
                android:layout_width="45dp"
                android:layout_height="45dp"
                android:layout_marginRight="10dp"
                android:layout_marginTop="10dp"
                android:background="@drawable/circle_send" />
        </TableRow>
    </TableLayout>

    <TableLayout
        android:id="@+id/tl_item_receive"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:padding="3dp"
            android:visibility="gone"
        android:shrinkColumns="2">

        <TableRow
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="left|top" 
            >

            <ImageView
                android:id="@+id/iv_receiverAvatar"
                android:layout_width="45dp"
                android:layout_height="45dp"
                android:layout_marginRight="10dp"
                android:background="@drawable/circle_send" />

            <ImageView
                android:id="@+id/iv_item_receive"
                android:layout_width="70dp"
                android:layout_height="70dp"
                android:background="@drawable/account"/>

            <TextView
                android:id="@+id/tv_item_receiver"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="50dp"
                android:background="@drawable/conversion_receiver"
                android:gravity="center_vertical"
                android:text="ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss疼啊蛋疼啊头也疼啊"
                android:textColor="#000000"
                android:textSize="18sp"/>
        </TableRow>
    </TableLayout>

</LinearLayout>

BaseAadapter中的getView代码如下:

public View getView(int position, View convertView, ViewGroup parent) {
		View view;
		ViewHolder holder = null;
		if(convertView != null){
			view = convertView;
			holder = (ViewHolder) view.getTag();
		}else{
			view = View.inflate(context, R.layout.item_conversion_detail, null);
			holder = new ViewHolder();
			holder.tl_item_send = view.findViewById(R.id.tl_item_send);
			holder.tv_item_send = (TextView) view.findViewById(R.id.tv_item_send);
			holder.iv_sendAvatar = (ImageView) view.findViewById(R.id.iv_sendAvatar);
			holder.iv_item_send = (ImageView) view.findViewById(R.id.iv_item_send);
			
			holder.tl_item_receive = view.findViewById(R.id.tl_item_receive);
			holder.tv_item_receiver = (TextView) view.findViewById(R.id.tv_item_receiver);
			holder.iv_receiverAvatar = (ImageView) view.findViewById(R.id.iv_receiverAvatar);
			holder.iv_item_receive = (ImageView) view.findViewById(R.id.iv_item_receive);
			view.setTag(holder);
		}
		if(conservationList.get(position).getIsSend()){//若是发送的会话
			holder.tl_item_send.setVisibility(View.VISIBLE);
			if(conservationList.get(position).getIsTV()){//若会话内容是字符串
				holder.tv_item_send.setVisibility(View.VISIBLE);
				holder.iv_item_send.setVisibility(View.GONE);
				holder.tv_item_send.setText(position + ":"+ conservationList.get(position).getSendStr());
			}else{//若会话内容是图片
				holder.tv_item_send.setVisibility(View.GONE);
				holder.iv_item_send.setVisibility(View.VISIBLE);
				holder.iv_item_send.setBackgroundResource(R.drawable.consult);
			}
//		}else{//若是接收到的会话
		}else if(!conservationList.get(position).getIsSend()){//若是接收到的会话
			holder.tl_item_receive.setVisibility(View.VISIBLE);
			if(conservationList.get(position).getIsTV()){//若会话内容是字符串
				holder.tv_item_receiver.setVisibility(View.VISIBLE);
				holder.iv_item_receive.setVisibility(View.GONE);
				holder.tv_item_receiver.setText(position + ":"+ conservationList.get(position).getReceiveStr());
			}else{//若会话内容是图片
				holder.tv_item_receiver.setVisibility(View.GONE);
				holder.iv_item_receive.setVisibility(View.VISIBLE);
				holder.iv_item_receive.setBackgroundResource(R.drawable.consult);
			}
		}
		return view;
	}


其中ViewHolder是一个防止多次findViewById的类,以空间换时间的做法,代码:

static class ViewHolder{
		public View tl_item_send;
		public TextView tv_item_send;
		public ImageView iv_sendAvatar;
		public ImageView iv_item_send;
		
		public View tl_item_receive;
		public TextView tv_item_receiver;
		public ImageView iv_receiverAvatar;
		public ImageView iv_item_receive;
		
	}
后来发现是省懒劲,以为布局中为每个view设置了visibility=gone在代码中就不必要再某些地方加代码xxx.setVisibility(View.GONE);了,其实这一句是非常重要的,不然当在某一个地方让这个view显示后,缓存中就存有这个效果,然后会莫名其妙的在其他地方出现了这个效果,令人蛋疼。。。

将getView的代码稍微加上几句看似紧要的代码即可正常:

	public View getView(int position, View convertView, ViewGroup parent) {
		View view;
		ViewHolder holder = null;
		if(convertView != null){
			view = convertView;
			holder = (ViewHolder) view.getTag();
		}else{
			view = View.inflate(context, R.layout.item_conversion_detail, null);
			holder = new ViewHolder();
			holder.tl_item_send = view.findViewById(R.id.tl_item_send);
			holder.tv_item_send = (TextView) view.findViewById(R.id.tv_item_send);
			holder.iv_sendAvatar = (ImageView) view.findViewById(R.id.iv_sendAvatar);
			holder.iv_item_send = (ImageView) view.findViewById(R.id.iv_item_send);
			
			holder.tl_item_receive = view.findViewById(R.id.tl_item_receive);
			holder.tv_item_receiver = (TextView) view.findViewById(R.id.tv_item_receiver);
			holder.iv_receiverAvatar = (ImageView) view.findViewById(R.id.iv_receiverAvatar);
			holder.iv_item_receive = (ImageView) view.findViewById(R.id.iv_item_receive);
			view.setTag(holder);
		}
		if(conservationList.get(position).getIsSend()){//若是发送的会话
			holder.tl_item_send.setVisibility(View.VISIBLE);
 			holder.tl_item_receive.setVisibility(View.GONE);
			if(conservationList.get(position).getIsTV()){//若会话内容是字符串
				holder.tv_item_send.setVisibility(View.VISIBLE);
				holder.iv_item_send.setVisibility(View.GONE);
				holder.tv_item_send.setText(position + ":"+ conservationList.get(position).getSendStr());
			}else{//若会话内容是图片
				holder.tv_item_send.setVisibility(View.GONE);
				holder.iv_item_send.setVisibility(View.VISIBLE);
				holder.iv_item_send.setBackgroundResource(R.drawable.consult);
			}
//		}else{//若是接收到的会话
		}else if(!conservationList.get(position).getIsSend()){//若是接收到的会话
 			holder.tl_item_send.setVisibility(View.GONE);
			holder.tl_item_receive.setVisibility(View.VISIBLE);
			if(conservationList.get(position).getIsTV()){//若会话内容是字符串
				holder.tv_item_receiver.setVisibility(View.VISIBLE);
				holder.iv_item_receive.setVisibility(View.GONE);
				holder.tv_item_receiver.setText(position + ":"+ conservationList.get(position).getReceiveStr());
			}else{//若会话内容是图片
				holder.tv_item_receiver.setVisibility(View.GONE);
				holder.iv_item_receive.setVisibility(View.VISIBLE);
				holder.iv_item_receive.setBackgroundResource(R.drawable.consult);
			}
		}
		return view;
	}
正常显示:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值