2016-10-13 27 views
1

私はリニアレイアウトマネージャーを備えたrecyclerviewを持っていて、それは異なるアイテムを含んでいます。 アイテムの1つに、このアイテムのネストされたレイアウトを非表示または表示するボタンがあります。Android RecyclerView - スクロールの変更アイテム

特定のタイプの10行のようなものを追加し、特定のアイテムをクリックするとそのネストされたレイアウトが表示されますが、別のアイテムがそれ自身のネストされたレイアウトを表示することがわかります。 2回目の試行では、いくつかのボタンをクリックしてスクロールすると、ネストされたレイアウトが別のアイテムに表示されました。

コードからわかるように、私はnotifyDataSetChanged()メソッドを呼び出そうとしましたが、それは役に立ちません。 私はリサイクルの図が展開されていることを知っているが、私の場合は、変更コード全体せずに、それを解決したい。..

レイアウト:

<RelativeLayout 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
> 
    <TextView 
     android:id = "@+id/tv" 
     android:layout_height="wrap_content" 
     android:layout_width = "wrap_content" 
     android:text = "click on the button" 
    /> 
    <Button 
     android:id = "@+id/btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Click Me" 
     android:layout_toRightOf="@+id/tv" 
    /> 

    <RelativeLayout 
     android:id = "@+id/nested" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/tv" 
     android:visibility="gone" 
    > 

     <TextView 
      android:id = "@+id/tv1" 
      android:layout_height="wrap_content" 
      android:layout_width = "wrap_content" 
      android:text = "click on the button" 
     /> 
    </RelativeLayout> 
</RelativeLayout> 

アダプタのコード([OnBind]の)

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) 
    { 
     int type = getItemViewType(position); 
     ViewType viewType = ViewType.values()[type]; 
     try 
     { 
      switch (viewType) 
      { 
       case VIEW1: 
        // code for view 1 
       break; 
       case VIEW2: 

        final ViewHolder viewHolder = (ViewHolder) holder; 

        viewHolder.tv.setText("TV1"); 
        viewHolder.btn.setOnClickListener(new View.OnClickListener() 
        { 
         @Override 
         public void onClick(View v) 
         { 

          viewHolder.nestedLayout.setVisibility(!isVisible ? View.VISIBLE : View.GONE); 
          viewHolder.isVisible = !viewHolder.isVisible; 

          // notifyDataSetChanged(); 
         } 
        }); 


       break; 

      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      Log.d("ChatListAdapter","chat list adapter ioexception" + e.getMessage()); 
     } 
    } 
+0

があなたの活動上、またはその断片でこのRecyclerViewですか? –

+0

@SamuelRobert、アクティビティ – Elior

+2

データモデルは、操作したいビューの可視性のステータスを保持する必要があります。それ以外の場合は、スクロールするときにそれを緩和します。 –

答えて

1

としては、サミュエル・ロバートが指摘し、あなたのモデルクラスで拡張項目の可視性を追跡する必要があります。

は、ネストされたレイアウトの可視性を追跡するために、その中のフィールドを持っている、あなたはモデルクラスのアイテムを使用していると言います。

これを試してみてください:

Item item = itemList.get(position); 
final ViewHolder viewHolder = (ViewHolder) holder; 
viewHolder.tv.setText("TV1"); 
viewHolder.nestedLayout.setVisibility(!item.isVisible ? View.VISIBLE : View.GONE); 
viewHolder.btn.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
     int position = getAdapterPosition(); 
     if(position != RecyclerView.NO_POSITION) { 
      Item item = itemList.get(position) 
      item.isVisible = !item.isVisible; 
      notifyItemChanged(position); 
     } 
     } 
    }); 
0

各ビュー(onBindViewHolderを呼び出すたびに)の可視性の状態を設定する必要があります。私はあなたのために何が起こるかは、後でリサイクルされ、可視性が設定されたビューの可視性を設定することです。

+0

の場合、可視性のデフォルト値は "なくなっています"。 ユーザが2番目のアイテムボタンをクリックすると、この特定のネストされたレイアウトの可視性値は「可視」になり、他のすべてのオブジェクトは「消えたまま」になります。 – Elior

+0

おそらく問題は発生しませんでした。値が設定されているビュー所有者に問題があるか、同じviewIdを持っているかのいずれかを示す複数のビューがある場合、後者は不可能であると思います。私はあなたがデバッグとして各ビューの値を印刷しようとすることをお勧めします。 – MaTePe

1

は、データモデルにidフィールドを持ち、getItemIdを(上書き)以下のように、

@Override 
    public long getItemId(int position) { 
     return yourList.get(position).getId(); 
    } 
関連する問題