關於ListView 錯位的問題

來源:互聯網
上載者:User
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubCacheView cacheView;System.out.println(position+"======"+(convertView==null));if (convertView == null) {convertView = inflater.inflate(R.layout.list_item, null);cacheView = new CacheView(convertView);cacheView.setTag(position);  //用於測試convertView.setTag(cacheView);} else {cacheView = (CacheView) convertView.getTag();}System.out.println("cacheView.tag==="+cacheView.getTag());}

上面的代碼是adapter 中重寫 getView ,一般情況下我們會通過上面的實現來最佳化listView。 對與每個item都先判斷  convertView是否為空白。 但到底這個convertView是什麼東東??

開始的時候我以為convertView就是每一項的view,每項的convertView之間沒有關係。 如果是這樣的話那每項第一次出現的時候convertView都為空白。但實際不是這樣的。把上面的代碼跑一遍就知道了。 那到底convertView是什麼呢? 來看張圖

ListView先請求一個type1視圖(getView)然後請求其他可見的項目。convertView在getView中是空(null)的。
當item1滾出螢幕,並且一個新的項目從螢幕低端上來時,ListView再請求一個type1視圖。convertView此時不是空值了,它的值是item1。你只需設定新的資料然後返回convertView,不必重新建立一個視圖。
(如果 item1的邊緣仍然可見(在頂端) convertView仍然是空值,因為recycler中沒有視圖)

就是這個樣子!!

如果想實現奇數行和偶數行顯示不同的顏色的功能,那應該怎麼做呢?開始的時候我是這麼做的:

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            int type = position % 2;
            
            if (convertView == null) {
                holder = new ViewHolder();
                switch (type) {
                    case 0:
                        convertView = mInflater.inflate(R.layout.item1, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.text);
                        break;
                    case 1:
                        convertView = mInflater.inflate(R.layout.item2, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
                        break;
                }
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.textView.setText(getItemViewType(position)+"");
            return convertView;
        }

顯然,通過上面的操作我們知道 只 這樣做是不行的。 會出現錯亂。     不過也很好解決。 我們只需要重寫 BaseAdapter 的 getItemViewType(int) 和
 getViewTypeCount()即可。
getItemViewType(int) 官方解釋: get the type of View that will be create by getView(int,View,ViewGroup) for the specified item.    

        @Override
        public int getItemViewType(int position) {
          if(position % 2 == 0 ){
         return 0;
          }
          return 1;
        @Override
        public int getViewTypeCount() {
            return TYPE_MAX_COUNT;
        }

系統每次調用getView的時候都會去調getItemViewType。getViewTypeCount()方法只會調用一次. 
謝謝 這篇文章: http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.