[英]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.