1. 程式人生 > >Android RecyclerView隱藏item(多佈局)的所在區域顯示空白

Android RecyclerView隱藏item(多佈局)的所在區域顯示空白

問題描述

由於需求,需要把recycler view的其中一個條目GONE掉,且該RecyclerView為多佈局狀態,複寫了getItemViewType()方法。若只是把內容隱藏,這樣就會出現一片空白區域,高度不會改變。

解決方法

把 item 的高度寬度設定為 0 ;顯示的時候再設定回來。

探究

網上的做法是,在onBindViewHolder裡呼叫該方法

 //防止隱藏item出現空白
    public void setVisibility(boolean isVisible, View itemView) {
        RecyclerView.LayoutParams
param = (RecyclerView.LayoutParams) itemView.getLayoutParams(); if (isVisible) { param.height = RelativeLayout.LayoutParams.WRAP_CONTENT;// 這裡注意使用自己佈局的根佈局型別 param.width = RelativeLayout.LayoutParams.MATCH_PARENT;// 這裡注意使用自己佈局的根佈局型別 itemView.setVisibility(View.VISIBLE
); } else { itemView.setVisibility(View.GONE); param.height = 0; param.width = 0; } itemView.setLayoutParams(param);

但是在我的專案裡會報異常

java.lang.NullPointerException: Attempt to write to field 'int android.view.ViewGroup$LayoutParams.height' on
a null object reference

解決

若是修改為以下方法,則正常

 //防止隱藏item出現空白
    public void setVisibility(boolean isVisible, View itemView) {
        RecyclerView.LayoutParams param = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        if (isVisible) {
            param.height = RelativeLayout.LayoutParams.WRAP_CONTENT;// 這裡注意使用自己佈局的根佈局型別
            param.width = RelativeLayout.LayoutParams.MATCH_PARENT;// 這裡注意使用自己佈局的根佈局型別
            itemView.setVisibility(View.VISIBLE);
        } else {
            param.height = 0;
            param.width = 0;
            itemView.setVisibility(View.GONE);
        }
        itemView.setLayoutParams(param);
    }

紀錄一下,與君共勉!

拼搏在技術道路上的一隻小白And成長之路