3

複数のRecyclerviewリサイクルをNestedScrollViewの中で管理する際に問題が発生しました。私が何をしようとしているのか教えてあげてください。NestedScrollView内で複数のRecyclerviewでリサイクルが発生しない

  1. 私はframe1とframe2という2つのフレームレイアウトを持っています。
  2. 私はrecyclerviewを含む2つのフラグメントを持っています。最初のフラグメントのrecyclerviewはアイテムを水平に表示し、2番目のフラグメントのrecyclerviewはリストを垂直に表示します。
  3. NestedScroolViewに入れました.frame1 recyclerviewはすべてのビューを適切にリサイクルしていますが、frame2 recylerviewはビューをリサイクルしていません。その理由を知らないのですか?最初にすべての項目をロードしてから画面に表示します。

いくつかのコード:

MainActivity.java

FragmentTransaction transaction; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
FragmentA frag1=new FragmentA(); 
FragmentB frag2=new FragmentB(); 
transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.frame1, frag1); 
    transaction.addToBackStack(frag1.getClass().getName()); 
    transaction.commit(); 

transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.frame2, frag2); 
    transaction.addToBackStack(frag2.getClass().getName()); 
    transaction.commit(); 
} 

main.xml

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <FrameLayout 
      android:id="@+id/frame1" 
      android:layout_width="match_parent" 
      android:layout_height="185dp" /> 

     <FrameLayout 
      android:id="@+id/frame2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      /> 

</LinearLayout> 
</android.support.v4.widget.NestedScrollView> 
    </LinearLayout> 

FragmentA:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View v= inflater.inflate(R.layout.recycler_view, container, false); 
    mDataListView = (RecyclerView) v.findViewById(R.id.data_list_view); 
    mDataListView .setHasFixedSize(true); 
    final GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), getActivity().getResources().getInteger(R.integer.playlist_categories_columns), GridLayoutManager.VERTICAL, false); 

    mDataListView .setNestedScrollingEnabled(false); 
    } 
    })); 


    return v; 
} 

FragmentB:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View v= inflater.inflate(R.layout.recycler_view, container, false); 
    mDataListView = (RecyclerView) v.findViewById(R.id.data_list_view); 
    mDataListView .setHasFixedSize(true); 
    final GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 1, GridLayoutManager.HORIZONTAL, false); 
    mDataListView .setLayoutManager(gridLayoutManager); 

    mDataListView .setNestedScrollingEnabled(false); 
    } 
    })); 


    return v; 
} 

recycler_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/data_list_view" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

私は私は私の質問で明らかだ願っています。

+0

で水平RecyclerView'sを表示するために実装することができますか?私は2つの水平RVとnestedScrollViewの中の垂直RVを持っている同様の状況で立ち往生しています。水平RVのアイテムはリサイクルされていますが、垂直RVのアイテムはありません:/ – Shubhral

+0

@Shubhral私は一見、私は問題を把握する方法を共有してください。それはあなたを助けるかもしれない –

答えて

0

私の経験から、複数のrecyclerview'sNestedScrollViewの中にある場合、ビューのリサイクルが不可能であることがわかりました。

しかし、私は自分の必要条件に応じて複数のRecyclerviewを表示するソリューションを見つけました。その上に1つの水平Recyclerviewとその下に1つのVertical Recyclerviewを表示したいので、共有しているものは誰かを助けるかもしれません。

私はRecyclerview'sの親としてNestedScrollViewを取り除き、垂直RecyclerviewHeaderViewとして水平Recyclerviewを作りました。

コード:

public class ListHeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
private static final int TYPE_HEADER = 0; 
private static final int TYPE_ITEM = 1; 
ArrayList<String> data; 

public ListHeaderAdapter (ArrayList<String> data) { 
    this.data = data; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == TYPE_ITEM) { 
     //inflate your layout and pass it to view holder 
     return new VHItem(null); 
    } else if (viewType == TYPE_HEADER) { 
     //inflate your layout and pass it to view holder 
     return new VHHeader(null); 
    } 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
int pos = position - 1; // for handling of Header view(use pos to fetch data from list) 

    if (holder instanceof VHItem) { 
     String dataItem = data.get(pos); 
     //cast holder to VHItem and set data 
    } else if (holder instanceof VHHeader) { 
     //cast holder to VHHeader and set data for header. 
    } 
} 

@Override 
public int getItemCount() { 
    return data.size()+ 1; // for handling of Header view 
} 

@Override 
public int getItemViewType(int position) { 
    if (isHeader(position)) 
     return TYPE_HEADER; 

    return TYPE_ITEM; 
} 

public boolean isHeader(int position) { 
    return position == 0; 
} 


class VHItem extends RecyclerView.ViewHolder { 
    TextView title; 

    public VHItem(View itemView) { 
     super(itemView); 
    } 
} 

class VHHeader extends RecyclerView.ViewHolder { 
    Button button; 

    public VHHeader(View itemView) { 
     super(itemView); 
    } 
} 
} 

注:あなたがそれに対する解決策を見つけるか、同じロジックが任意の位置

関連する問題