2016-04-11 50 views
2

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

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

問題的

可視化表示:

理想狀況

enter image description here

當前的和不需要的情況

enter image description here

RecyclerView有點容易正確地容納物品。

我該如何避免發生這種情況?

編輯:

在評論的一個建議,我可能有動畫和轉換的觀點我自己。這是必要的還是有另一種方式呢?如果是這樣,我該如何動畫和轉換觀點?

編輯2:

試過這樣的回答:Animating items,但問題仍然存在。有一個可見的延遲,直到RecyclerView更新。

EDIT 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); 
    } 
} 
+0

試着讓'TextViews'' INVISIBLE'而不是'GONE'。 – sonictt1

+0

你可以發佈你的代碼顯示發生了什麼?如果數據發生變化,您應該能夠簡單地調用recyclerView.getAdapter()。notifyDataSetChanged();並且它應該正確重繪recyclerView。 – LNI

+0

@LNI我這樣做,但如上所述,問題出現在短時間內(我猜'RecyclerView'更新),然後它正確呈現。 – OneEyeQuestion

回答

0

這樣您的問題是:在你的XML(項目視圖),可以聲明TextView的默認屬性:

android:visibility="gone" 

時檢查條件:

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

取而代之,你應該這樣做:

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

我正在做你的建議。問題在於,當可見性更改爲「可見」時,「RecyclerView」會在短時間內顯示具有新高度的項目,但與下面的項目重疊。 – OneEyeQuestion

+0

你可以顯示你的代碼嗎? –

+0

如果您刪除數據綁定和所有內容,我的代碼與您的代碼完全相同 – OneEyeQuestion

0

如果它的高度變爲0,它將不可見:)。我假設你的根佈局確實有一些最小高度(或確切的高度),即使它已經消失仍然會佔用空間。

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來改變視圖的可見性。

相關問題