最近做一個有聊天界面的應用,從服務器獲取數據,顯示有問題,如下圖
這種錯誤真令人噁心,開始以爲是優化代碼搞出來的問題,仔細看了下,沒問題,估計是緩存的問題,
佈局代碼如下:
<?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; }正常顯示: