5

모든 게임의 itemView 내에 게임 목록을 표시하는 응용 프로그램을 개발 중이며 표시 할 비디오 목록도 있습니다. 미리보기 및 구조는 다음과 같습니다.여러 개의 중첩 된 RecyclerViews간에 동일한 LayoutManager를 공유하는 방법이 있습니까?

enter image description here

나는 윈도우 루트보기로 RecyclerView를 배포 한 다음 비디오를 위해, 나는 표시 그리드 스타일 RecyclerView을 사용, 그래서 여기에 우리가 중첩 된 RecyclerView 구조를 얻었다.

비디오 사이에 비디오 수가 일치하지 않기 때문에 문제가 있습니다. 비디오 목록의 RecyclerView를 스크롤 할 수 없기 때문에 가장 좋은 방법은 동적으로 뷰의 높이를 늘리는 것입니다. 있다. 실망스러운 결론은 인터넷에서이를 달성 할 방법이 없다고 들었습니다. 그게 진짜인가? 어떤 대안이 이것을 할 수 있습니까?

지금까지이 질문에 대해 나는 그것을 풀지 않을 것이므로 RecyclerView의 높이를 수동으로 임시 해결책으로 변경합니다. 그 RecyclerViews 그 비디오의 itemViews을 다시 사용할 수 있는지가 이미 화면 꺼짐으로 스 와이프하면

videoGridRecyclerView.getLayoutParams().height = rowCount * 242; 

비디오 항목이 완전히 동일한 구조임을 감안할 때, 그것은 좋은 것, 그것은하여야한다 훨씬 더 나은 성능 향상을합니다.

그런 다음 특정 RecycledViewPool을 중첩 된 모든 RecyclerViews로 전달하려고했습니다.

public class MainActivity extends Activity { 
    private RecyclerView.RecycledViewPool mViewPool; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // create the RecycledViewPool from first and re-use for each nested RecyclerViews. 
     mViewPool = new RecyclerView.RecycledViewPool(); 
     ... 
    } 
} 

심지어 나는 내가 onCreateViewHolder 방법이 수행되고 있음을 통지하고 난 원형 루트 RecyclerView 슬쩍 동안 증가 점점 부풀려 카운터를 유지, 이러한 노력을 수행.

private static class VideoAdapter extends RecyclerView.Adapter<GridViewHolder> { 
    private List<Video> mVideoList; 

    private VideoAdapter(List<Video> videoList) { 
     mVideoList = videoList; 
    } 

    // this method would always invoke during i swipe the RecyclerView. 
    @Override 
    public GridViewHolder onCreateViewHolder(ViewGroup container, int viewType) { 
     Log.e("", String.format("createViewCount : %d", ++MainActivity.STAT_GAME_VIDEO_ITEM_COUNT)); 
     return new GridViewHolder(inflate(container, R.layout.game_video_item)) {}; 
    } 
} 

이 아이디어가 효과가 있습니까? 아니면 내가 잘못 했니? 나는이 효과를 얻고 싶다. RecyclerView에 관한 것이 아닌 다른 조언은 감사 할 일이다. 미리 감사하라.

답변

3

지금까지 중첩 된 RecyclerView 대신 GridLayout을 사용하고 GridLayout 내부의보기를 직접 리사이징했습니다. 그러나 그것은 나의 재활용 논리가 매우 단순하기 때문에 아마 좋은 방법이 아닙니다. 응용 프로그램은 여전히 ​​약간의 말더듬이가 빠르며, 나는 그것을 파악하지 못했습니다. 실행 가능한 결말로, 나는 내 코드를 github에 넣는다. 아이디어가 있으면 알려주세요, 고마워요.

2

네, 지금하고있는 일이 옳습니다.

RecyclerViewPool을 만든 다음 (을 통해) 모든 RecyclerView 인스턴스에 제공하십시오. 이렇게하면 같은 뷰 풀을 공유하게됩니다.

캐시 크기를 늘리면 항목 간 조회수가 크게 다를 때보기가 변경되는 것을 방지 할 수 있습니다.

Btw, 측면 제안으로 중첩 된 RecyclerViews 대신 하나의 RecyclerView로 병합을 시도합니다. 이 방법은 애니메이션 등 훨씬 더 좋게 실행할 수 있습니다. 또한 RV 내부에서 RV를 사용하면 같은 방향으로 스크롤하는 것이 문제가되며 문제를 하나에 병합하여 피할 수 있습니다.

+2

제 경우에는 하나의 RecyclerView 만 사용하면됩니다. 불확실한 크기의 비디오 그리드는 어떻습니까? 솔직히 말하면, RecyclerViews를 중첩하고 싶지는 않지만, 내가 원하는 것을 실현하기위한 또 다른 접근법을 찾지 못할 수도 있습니다. 만약 당신의 뜻을 잘못 이해한다면, 내 설명이나 코드를 보여줄 수 있습니까? – VinceStyling

+0

@yigit 캐시 크기를 늘리려면 어떻게해야합니까? 조금 도움이되는 setMaxRecycledViews()를하고 있지만 onCreateViewHolder()가 너무 많이 호출되는 것을 볼 수 있습니다. 왜 일부보기가 재활용 대신 만들어 졌는지 이해할 수 없습니다. 심지어 setMaxRecycledViews() 메서드의 첫 번째 매개 변수로 전달할지 모르겠다. 내 리사이클러는 1 개의 항목 또는 최대 20 개의 항목을 가질 수 있으며 20 개의 항목 중 하나에 도달하면보기가 재활용되지 않은 것처럼 보입니다. 리사이클 뷰에서 풀을 공유하는 것에 대한 예제를 보거나 더 많은 정보를 얻을 수있는 곳이 있습니까? 감사. – Sotti

관련 문제