Android列表頁的錯位問題探討

Ⅰ.前言

在日常的項目開發中,類似於下面的列表頁一般是採用ListView或RecyclerView去實現,有時候會出現其條目上的圖片或文字錯位的情況,而解決錯位的常用方法是爲錯位的控件設置標識,比如當點擊時候再將其標識取出進行操作,可以說”設置標識”的方法基本可以解決大多列表頁錯位的情況。

這裏寫圖片描述這裏寫圖片描述

上面”設置標識” 的方法雖然可以解決大多數列表頁錯位的情況,但總有特殊情況. 前幾天在項目開發中也遇到列表頁錯位的情況,主要是App裏的通訊錄的頭像錯位了,嘗試”設置Tag”的方法卻得不到解決,所以當遇到問題的時候就得針對所遇到的問題進行分析,找到發生該問題的原因,才能更好的找到解決的方法.下面將分析、問題緣由以及如何解決等步驟總結記錄下.

Ⅱ.總結,才能更好的提升

分析:

通訊錄列表頁的頭像發生錯位是屬於偶然性的,事出反常必有因,接連測試發現:”當進入通訊錄頁面立即對列表頁進行快速滑動,當滑動停下來的時候,圖片錯位就隨之發生了”.

緣由:

由於滑動過程中滑動的速度快於圖片從網絡加載的速度,而在適配器的getView方法裏是使用條目複用的方式,對ListView進行性能優化. 如果是使用RecyclerView控件默認就帶有複用的效果,還擁有持有控件的ViewHolder類.

假設從條目A快速滑動到條目H,再假設條目H是複用了條目A的,這時條目H對應的圖片還未從網絡加載完成,所以沒法顯示在圖片控件上,所以顯示的依舊是條目A的圖片,而當我們滑動停下來的時候,條目H的圖片就發生錯位的現象.

解決:

由於項目中使用的是Picasso框架加載圖片,該框架是有對圖片錯位做了處理的,那麼也方便解決:


    //對ListView的滾動狀態進行監聽
    listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

                switch(scrollState){//正常情況是 1===>2====>0
                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE :

                        Picasso.with(Global.getContext()).resumeTag((Context)mActivity);
                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                        Picasso.with(Global.getContext()).pauseTag((Context)mActivity);
                        break;
                }
            }
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            }
        });

    //在適配器的getView方法中對圖片設置Tag
      Picasso.with(this.context).load(url).placeholder(R.drawable.photo)
                        .error(R.drawable.photo)
                        .tag(context)
                        .into(viewholder.iv_icon);

思路:

主要是在列表頁滑動的時候取消對圖片的加載,當列表頁停止滑動的時候才進行加載圖片,這樣就可以避免圖片錯位的發生.

Ⅲ.總結

  • 1.Picasso框架已經解決了列表頁的圖片加載錯位的問題,只需要實現相應的api;
  • 2.設置Tag的方式並不能解決上面滑動導致的錯位問題,使其圖片在列表頁滑動時不加載,列表頁停止時才加載的方式就可以解決錯位問題;
  • 3.根據之前解決列表頁錯位的思路總結,設置Tag的方式比較適合將數據綁定於控件上,在某個時段(比如點擊事件時,通過控件取出數據)再取出來對其數據操作;
  • 4.Glide框架更優於Picasso框架,還等待着前去探索,郭嬸已經在研究中咯;
  • 5.週六,早起的鳥兒有蟲吃,晚起的蟲兒被鳥吃 ~~ 起牀了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章