簡體   English   中英

RecyclerView 帶有隱藏/顯示其子項的項目

[英]RecyclerView with items that hide/show their childs

我有一個RecyclerView ,其中的項目是一個LinearLayout有幾個TextViews作為孩子。 根據某些規則(這在onBindViewHolder決定), TextViews可能被隱藏(可見性消失)或顯示。

我的問題是,如果我在RecyclerView有 3 個項目(A、B 和 C),並且具有相同數量的可見TextViews並且 A 位於列表頂部,B 在中間,C 在底部,例如B 必須顯示比以前更多的TextViews ,在很短的時間內,此項目 (B) 將與 C 重疊,因為它的大小已經增長,並且必須容納以前具有可見性 GONE 的新可見TextViews

問題的可視化表示:

期望的情況

在此處輸入圖片說明

當前和不希望的情況

在此處輸入圖片說明

過了一會RecyclerView正確地容納了該項目。

我怎樣才能避免這種情況發生?

編輯:

在其中一條評論中建議我可能必須自己制作動畫和轉換視圖。 這是必要的還是有另一種方法? 如果是這樣,我如何動畫和轉換視圖?

編輯2:

試過這個答案: Animating items ,但問題仍然存在。 RecyclerView更新之前有一個明顯的延遲。

編輯 3:

我使用這個類( RecyclerViewCursorAdapter )作為填充RecyclerView的適配器的基礎。 另外,我在onResume這樣做

@Override
public void onResume()
{
    super.onResume();

    if(getActivity().getSupportLoaderManager().getLoader(R.id.myLoaderId) == null)
    {
        getActivity().getSupportLoaderManager().initLoader(R.id.myLoaderId, null, this);
    }
    else
    {
        getActivity().getSupportLoaderManager().restartLoader(R.id.myLoaderId, null, this);
    }
}

關鍵是使用RecyclerView.ViewHolder 類setIsRecyclable()方法。 將此屬性設置為 true 為在此處輸入鏈接描述

您的問題是:在您的 xml(項目視圖)中,您使用默認屬性聲明 textView:

android:visibility="gone"

檢查條件時:

if (condition) {
    textView.setVisibility(View.VISIBLE);
}

相反,你應該這樣做:

if (condition) {
    textView.setVisibility(View.VISIBLE);
} else {
    textView.setVisibility(View.GONE);
}

如果它的高度變為 0,它將不可見:)。 我假設您的根布局確實有一些最小高度(或精確高度),即使它已經消失,它仍然占用空間。

如果你還需要添加流暢的動畫效果,試試這個。

默認情況下,將可見性 == 消失。

    @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
    super.onBindViewHolder(holder, position);

    holderG.layoutReply.setVisibility(View.GONE);
}

並設置可見性,例如:

 holder.button.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View view)
                {
                        if (holderG.layoutReply.getVisibility() == View.VISIBLE) {                   
                            notifyItemChanged(holderG.getAdapterPosition());
                        }
                        else {holderG.layoutReply.setVisibility(View.VISIBLE);
                        }
                    }
                }
            });

並在您的充氣機布局集中

android:animateLayoutChanges="true"

用於父布局。

注意 - 在可見性==可見性的情況下,動畫布局更改工作正常且流暢,但在可見性==GONE項目相互重疊的情況下,這就是我使用notifyItemChanged來更改視圖可見性的原因。

使用notifyItemChanged(int position)提供的notifyItemChanged(int position)函數來通知項目已更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM