中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

安卓Adapter去item重復使用的方案!

發布時間:2020-06-24 16:39:39 來源:網絡 閱讀:2257 作者:獨行瞎 欄目:移動開發

關于adapter去重復的問題其實是個很簡單的問題,很多人沒有理解到list,grid以及recyclerview重復利用item以及使用viewholder的原理,所以在去重的道路上走得很坎坷,在這里小羽帶著大家去好好的學習和總結一下item的知識,然后使用十分簡潔的方案去有效的解決重復使用item帶來的問題。

1.認識item的重復使用和viewholder的出現

item的重復使用目的是為了解決大量的list數據消耗大量的視圖空間,而viewholder的出現是系統在解決數據顯示的時候做的一種方案。

而這種方案主要針對的是重復的item但是數據不同。通過tag去綁定在item上然后再取得使用。

保證了每個已經創建的item上一定有個viewholder,所以每次刷新item的時候都必須要把數據和各種狀態綁定一遍,否則滑動的時候就會有重復顯示的問題。

2.從系統原理上去去重復

上面我們講了item通過viewholder去解決數據重復的方案,雖然有點繁瑣,但是有效可行。
有人要問:“如果我想改變某個item的屬性又不想重復使用導致其他item屬性也改變,什么辦法好用呢?”。
這個問題最近的項目里我也遇到了。而且是一個item里面有兩個子item,這兩個子item也要一摸一樣,但是不能同時干擾。
需要做屬性動畫去改變樣式!!(是不是很蛋疼?畢竟公司想要炫酷,那我們就按需設計唄!)。
既然item重復利用,那么item的子控件都會是同一個對象。
所以小羽滋生了一種想法,既然控件是一樣的,那么我可以記錄一個當前選中的item或者它的一個控件,如果是當前item并且對應的position也是一樣的,那么肯定是當前的item可以做改變,當滑動到重復利用的item時,雖然也是當前的item但是position卻不一樣,所以這時候就做默認的設置。
當滑回來的時候滿足前面的條件所以又會繼續改變。為什么可以這么自信的使用這種方案?原因很簡單。
系統在重復利用item的時候是做過處理的,重復利用的這個item不可能和上個item同時出現在屏幕上。
所以我們不需要像viewholder一樣把每種狀態都做改變,因為即使此刻的上一個item的屬性會隨著當前item屬性改變而改變,放心你是看不見的,所以我們不必擔心這種方案的不可行!

3.源碼分析

//recyclerview的adapter開始BindViewHolder
    @Override
    public void onBindViewHolder(RecViewHolder holder, final int position) {
        if(!Utils.listIsEmpty(mTopPaymentTypes) && mTopPaymentTypes.size() > position){
            PaymentType topPaymentType = mTopPaymentTypes.get(position);
            initPayBtnResource(holder.topPayViewItem, position, topPaymentType);
        }

        if(!Utils.listIsEmpty(mBottomPaymentTypes) && mBottomPaymentTypes.size() > position){
            PaymentType bottomPaymentType = mBottomPaymentTypes.get(position);
            initPayBtnResource(holder.bottomPayViewItem, position,bottomPaymentType);
        }
    }

    //設置item數據
    private void initPayBtnResource(View itemView, int position, PaymentType paymentType) {
        TextView payTypeName = (TextView) itemView.findViewById(R.id.payview_item_name);
        ImageView payTypeImage = (ImageView) itemView.findViewById(R.id.payview_item_image);
        View payTypeLight = itemView.findViewById(R.id.payview_item_light);
        PayTypeSource paySource = mPaySources.get(paymentType);
        if (paySource != null) {
            payTypeName.setText(paySource.getPayTypeName());
            //viewholder綁定item數據
            bindItemData(View itemView, int position, PaymentType paymentType);

            //下面這段語句就是解決item重復使用修改屬性導致其他item出現問題的方案。
            if (mCheckedPayType == paymentType) {
                startLightAnimator();
                mAnimPayLight = payTypeLight;
            } else {
                if (mAnimPayLight == payTypeLight) {
                    endLightAnimator();
                }
            }
        }

        if (isSinglePay) {
            itemView.setOnClickListener(null);
            itemView.setBackgroundResource(R.drawable.pay_item_uncheck);
        } else {
            itemView.setOnClickListener(mClick);
            itemView.setTag(paymentType);
            itemView.setBackgroundResource(R.drawable.pay_item_can_change);
        }
    }

4.總結該方案!

這個方案只在單個item重復使用的時候才會被調用做改變,不需要每個item都去改變屬性來保持平衡,非常簡單直觀的解決的重復利用的問題,從代碼的簡潔和系統執行的效率上說,都比較優,缺點就是多占了一個引用的內存,性價比上來說非常的靠譜。
有人肯定要問后面的endLightAnimator();只結束了動畫但是屬性還是變了。
這里小羽不得不吐槽一句了:“每個人的項目需求不一樣,我這里是浮光效果,不選中的時候我可以直接把浮光隱藏掉就行了,至于這個屬性在那個位置都不重要了”。
那么如果是一定要顯示的去改變屬性呢?這個小羽在3里面就說了,默認屬性,就是比如你貼了一個機器人,要把他變成瘦機器人,那么這里end的時候直接賦值一個原來的機器人.方案是對的,問題是解決問題的需求不一樣大家要按照自己的需求去實現。
原諒小羽不能貼出所有代碼(雖然代碼是自己寫的,但是作為公司商業化產品,部分保密還是需要的)。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扎鲁特旗| 沙洋县| 东丽区| 漯河市| 乐陵市| 崇州市| 西林县| 绥德县| 天峻县| 桂平市| 饶阳县| 宁明县| 庆安县| 永福县| 依安县| 万载县| 拜城县| 巢湖市| 乌恰县| 乌拉特中旗| 汝州市| 江达县| 故城县| 虎林市| 北票市| 永清县| 宜兴市| 乡宁县| 永兴县| 化州市| 上犹县| 仁怀市| 安徽省| 崇礼县| 天气| 祁连县| 阜新| 福建省| 鄂伦春自治旗| 承德市| 淮滨县|