2016-04-11 11 views
2

私はRecyclerViewを持っていますが、アイテムはLinearLayoutであり、いくつかは子どもとしてTextViewsです。いくつかの規則(これはonBindViewHolderで決定されます)によっては、TextViewsが隠れている(可視性がなくなっている)か、表示されている可能性があります。子どもを隠す/表示するアイテムを含むRecyclerView

RecyclerViewの例では、3つの項目(A、B、C)が表示され、同じ数字がTextViewsであり、Aがリストの最上部にある場合、中間のBと下部のC例えば、Bが以前よりもTextViewsを表示しなければならない場合、短時間の間、この項目(B)は、サイズが大きくなり、以前に可視性GONEであった新しい表示TextViewsに対応する必要があるため、Cと重複する。問題の

ビジュアル表現:

理想の状況

enter image description here

現在、望ましくない状況

enter image description here

少し後にRecyclerViewが項目を正しく収容します。

どうしたらこのようなことを回避できますか?

EDIT:

コメントの一つでは、私は自分自身をアニメーションとビューを変換する必要がある場合がありますことを示唆しています。それが必要なのですか、それを行う別の方法がありますか?もしそうなら、どうやってアニメーションを作成し、ビューを変換できますか?

EDIT 2:Animating items、しかし、問題は解消されない:

この回答をしようとしました。 RecyclerViewが更新されるまで表示されるまでの遅延があります。

EDIT 3:

私はRecyclerView移入アダプタのベースとして、このクラス(RecyclerViewCursorAdapter)を使用しています。あなたのXML(アイテムビュー)で、デフォルトの属性でのTextViewを宣言します:Aditionally、私は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

'GONE'の代わりに' TextViews'を 'INVISIBLE'にしてみてください。 – sonictt1

+0

何が起きているのかを示すコードを投稿できますか?データが変更された場合、単にrecyclerView.getAdapter()を呼び出すことができるはずです。notifyDataSetChanged(); recyclerViewを正しく再描画する必要があります。 – LNI

+0

@LNI私はそれをやっていますが、述べたように、短期間に問題が発生します(私は 'RecyclerView'が更新されていると思います)、正しくレンダリングされます。 – OneEyeQuestion

答えて

0

でこれをやっているあなたの問題があることである

android:visibility="gone" 

時にチェック条件:

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

代わりに、次のようにする必要があります。

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

私はあなたの提案をしています。問題は可視性が 'VISIBLE'に変更されたとき、' RecyclerView'は新しい高さの項目を短時間表示しますが、以下の項目をオーバーラップさせることです。 – OneEyeQuestion

+0

あなたのコードを表示できますか? –

+0

データバインディングとそのすべてのものを削除すると、私のコードはあなたのものとまったく同じです – OneEyeQuestion

0

高さが0になると、表示されません。私はあなたのルートレイアウトは、それがまだであってもスペースを取るいくつかの最小の高さ(または正確な高さ)を持っていると仮定します。

0

滑らかなアニメーション効果を追加する必要がある場合は、これを試してください。

デフォルトでは、visibility ==はなくなりました。以下のような

@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" 

を設定します。

注 - 可視性== VISIBLEの場合、アニメーションレイアウトの変更はきれいで滑らかですが、可視性がある場合は== GONEアイテムが重なっているため、notifyItemChangedを使用してビューの可視性を戻しています。

関連する問題