關於listview中是用多個佈局 並使用holderView 緩存機制的問題

今天碰到一個關於listview 中使用2個或多個不同的佈局的問題,由於我的listview 的一個item 其實就是一個activity 界面相當大 也就是說 我的每個item 的內容相當多,所以如果不用緩存機制,那是相當的卡 就相當於每次在創建一個activity 非常的卡頓的! 處於這種問題 就只能使用緩存機制了!緩存機制的使用加載兩個佈局,那麼當你去gettag的時候 在兩個不同的item佈局間切換時 絕對會爆炸! 原因這個就相當簡單了 是兩個不同的tag之間 由於你的兩個佈局不同 是不能進行轉化的! 我再往上找了許多方法, 網上都是一些沒有使用緩存機制的 根本就不會存在這樣的問題 他們都是直接new 每個佈局,當然 他們的佈局內容量相當小,不像我這麼大!又或者說他們使用了緩存機制,但是num 是不足的 一次就加載完了 而真正意義上的緩存機制根本沒使用 ,只是代碼那樣寫 其實當num大了 他們的是會炸的 (說明:我只是說我看到的 ,因爲他們給的和我初始的代碼基本相同,所謂的核心他們是沒有的);
如何解決問題:
這裏給大家一個方法:但是個人總覺得有點彆扭 ,希望有更好方法的小夥伴給出更好的方法;
方法如下:
在gettag的時候我們使用異常來處理,拋出異常就從新加載一次界面,不過不是讓大家去再去new 太費事了,直接在catch中寫一句 return getView(position,null,parent);
特別說明:爲了保證當前的數據,千萬別改position 和parent 只需要把view改爲null 就能解決了 從新掉一次該方法 這裏給大家說一下 最好使用return語句;
給大家看看我的代碼寫法:

  public View getView(int position, View convertView, ViewGroup parent) {
      /**
       * @params: twotable onetable分別是我的兩個holderview
       */

            if (position == datalist.size() - 1) {// 應該加載檢驗第二界面的數據

                if (convertView == null) {
                    convertView = LayoutInflater.from(Wr_flag.this).inflate(R.layout.activity_wr_wrj_two, null);
                    two = new twoTable();
                    initTwo(convertView);//初始化two的界面
                    convertView.setTag(two);
                }else {
                       try {
                           two=(twoTable) convertView.getTag();
                    } catch (Exception e) {
                           return   getView(position, null, parent);//return  
                    }


                }
                setTwoInfo(position);
            }
            if(position<datalist.size()-1) {
                 if(convertView==null) {
                       convertView=LayoutInflater.from(Wr_flag.this).inflate(R.layout.wr_wrj_jyjl, null);
                       one=new  oneTable();
                       initOne(convertView);
                       convertView.setTag(one);
                    }else {
                          try {
                              one=(oneTable) convertView.getTag();
                        } catch (Exception e) {
                               return   getView(position, null, parent);
                        }

                    }
                    setOneInfo(position);
            }
            return convertView;
        }  

謝謝大家觀賞,暫時沒想出其他的號辦法有好辦法的或者想法的小夥伴留個代碼再走

發佈了43 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章