ListView的优化及显示
来源:互联网 发布:网络危机处理 编辑:程序博客网 时间:2024/06/06 09:26
最近做一个有聊天界面的应用,从服务器获取数据,显示有问题,如下图
这种错误真令人恶心,开始以为是优化代码搞出来的问题,仔细看了下,没问题,估计是缓存的问题,
布局代码如下:
<?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;}正常显示:
0 0
- ListView的优化及显示
- ListView 的优化及使用
- ListView的使用及优化
- ListView的适配器及优化
- 适配器及ListView的优化
- Android Listview(列表显示)性能优化的相关专利方法及系统
- 44黑名单界面显示&&ListView的优化
- ListView 显示网络图片,问题解决及性能优化
- listview的优化及viewholder的使用
- Android listview的实现及优化
- ListView的复用及如何优化
- ListView的工作原理及优化
- BaseAdapter自定义适配器及ListView的优化
- Android 中 ListView的使用及优化
- ListView的性能优化及进阶
- ListView 的优化 及图片缓存处理
- Android中ListView的使用及优化
- ListView的原理及性能优化
- 顺序循环队列
- fsterytr
- gdgrfh
- selected部分操作②
- java中Keytool的使用总结
- ListView的优化及显示
- Linux下如何进行FTP设置(阿里云)
- ddsfd
- 红黑树插入与删除 算法实现+代码(一)
- 谈谈CSS中的position属性
- 设置Combo box控件的下拉列表的长度
- keytool
- 《凤凰台上忆吹箫》
- 数据链路层网络实验-设计型实验