關於一個ListView使用多個item佈局在優化時出現顯示錯亂的解決方案
阿新 • • 發佈:2019-02-09
一個很麻煩的問題,引用兩個或者多個佈局由於使用了ViewHolder和contenView做優化,頁面在複用時出現要顯示的內容錯亂,經過上網查詢和查谷歌官方的原始碼終於解決了這個問題
首先看下谷歌原始碼是怎麼寫的
這個是Adapter.class檔案中的一段程式碼
/**
* Get the type of View that will be created by {@link #getView} for the specified item.
*
* @param position The position of the item within the adapter's data set whose view type we
* want.
* @return An integer representing the type of View. Two views should share the same type if one
* can be converted to the other in {@link #getView}. Note: Integers must be in the
* range 0 to {@link #getViewTypeCount} - 1. {@link #IGNORE_ITEM_VIEW_TYPE} can
* also be returned.
* @see #IGNORE_ITEM_VIEW_TYPE
*/
int getItemViewType(int position);
這個方法主要告訴我們自己可以設定傳入item的型別並將型別指定到getView方法中。但是我這裡面說道了getViewTypeCount這個
這個說的是我們可以設定返回將建立的檢視型別的數量。
/**
* <p>
* Returns the number of types of Views that will be created by
* {@link #getView}. Each type represents a set of views that can be
* converted in {@link #getView}. If the adapter always returns the same
* type of View for all items, this method should return 1.
* </p>
* <p>
* This method will only be called when when the adapter is set on the
* the {@link AdapterView}.
* </p>
*
* @return The number of types of Views that will be created by this adapter
*/
int getViewTypeCount();
下面看下我寫的Adapter
public class AnswerAdapter extends BaseAdapter {
private Context context;
private List<Answer> list;
private static final int TYPE_LEFT = 1;
private static final int TYPE_RIGHT = 2;
public AnswerAdapter(Context context, List<Answer> list, int photo_id) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Answer getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//預設值是1
@Override
public int getViewTypeCount() {
return 3;
}
//這裡設定type型別
@Override
public int getItemViewType(int position) {
return list.get(position).getType();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final RightViewHolder rightviewHolder;
final LeftViewHolder leftviewHolder;
Answer answer = getItem(position);
if (convertView == null) {
switch (answer.getType()) {
case TYPE_LEFT:
convertView = View.inflate(context, R.layout.answer_left_item,null);
leftviewHolder = new LeftViewHolder();
leftviewHolder.lefttv = (TextView) convertView
.findViewById(R.id.answer_tv);
convertView.setTag(leftviewHolder);
break;
case TYPE_RIGHT:
convertView = View.inflate(context, R.layout.answer_right_item,
null);
rightviewHolder = new RightViewHolder();
rightviewHolder.righttv = (TextView) convertView
.findViewById(R.id.answer_tv);
convertView.setTag(rightviewHolder);
break;
}
} else {
switch (answer.getType()) {
case TYPE_LEFT:
leftviewHolder = (LeftViewHolder) convertView.getTag();
leftviewHolder.lefttv.setText(answer.getBody());
break;
case TYPE_RIGHT:
rightviewHolder=(RightViewHolder)convertView.getTag();
rightviewHolder.righttv.setText(answer.getBody());
break;
}
}
return convertView;
}
class RightViewHolder {
TextView righttv;
TextView timetv;
ImageView rightimg;
}
class LeftViewHolder {
TextView lefttv;
TextView timetv;
ImageView leftimg;
}
}
這樣就解決了複用錯亂的問題。但是還有一個問題,為什麼我的listView第一次不初始化,必須上下滾動後才可以載入資料,有解決的一定要貼給我哦!!三克油