1. 程式人生 > >關於一個ListView使用多個item佈局在優化時出現顯示錯亂的解決方案

關於一個ListView使用多個item佈局在優化時出現顯示錯亂的解決方案

一個很麻煩的問題,引用兩個或者多個佈局由於使用了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第一次不初始化,必須上下滾動後才可以載入資料,有解決的一定要貼給我哦!!三克油