0

RecyclerView의 레이아웃 프리젠 테이션을 목록에서 그리드로 또는 그 반대로 변경하고 싶습니다. 그래서 난 내 onCreateViewHolder 방법을 변경 한 내 기능의 방법RecyclerView의 Android 변경 레이아웃 프리젠 테이션

if (presentation.equals("grid")) { 
    return LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_grid, parent, false); 
} 
else { 
    return LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_list, parent, false); 
} 

, 나는 LayoutManager 다음 방법 notifyDataSetChanged();

if (presentation.equals("grid")) { 
    recyclerView.setLayoutManager(new GridLayoutManager(context, 3)); 
} 
else { 
    recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
} 
adapter.notifyDataSetChanged(); 

.setLayoutManager(..)에서하지만이 기능을 사용할 때, 레이아웃의 일부에서 서로 다른 설정 그리드 레이아웃과 일부는 목록 레이아웃에서.

나는 그 요소가 보이지 않을 때 RecyclerView 요소를 재사용한다는 것을 알고 있지만, 이것을 올바르게 표시하고 요소를 계속 재사용하는 방법을 알고 있습니까?

+0

'LayoutManager'를 바꿀 코드를 보여줍니다 .. !! –

+0

당신의 질문과 관련이 없지만,'presentation'을'String'이 아닌'enum' (타입 안전성을 줄 것입니다)으로 저장하거나'int' 필드를'int'로 저장하는 것을 고려해야합니다 값에 대한 상수 (#enumsmatter를 믿지 않으면 더 나은 성능을 제공합니다). –

+0

그것은 복잡한 인터페이스입니다,하지만 나는이 글의 목적을 위해 간단한 문자열과 IF로 변경하여 여러분을 혼란스럽게하고 싶지 않았습니다. – Lau

답변

1

onCreateViewHolder()RecyclerView에 뷰 홀더가 충분하지 않아 새 뷰를 생성해야하는 경우에만 호출됩니다. 그러나 이전에 생성 된 뷰 홀더를 유지하고 다시 사용합니다. 프레젠테이션을 "그리드"로 변경하면 새로운 "그리드 뷰 보유자"가 생성되기 시작하지만 이전의 "목록보기 소유자"는 여전히 풀에 있으며 재사용됩니다. 보기 소유자가 섞이지 않는 방법이 필요합니다. 나는 두 가지 해결책을 볼 수있다.

항목보기 유형도 변경해야합니다. 일반적으로 동시에 하나 이상의보기 유형을 표시 할 수 있습니다 (예 : 작고 큰 항목을 혼합하는 경우). 귀하의 경우에는 당신은 여전히 ​​각 항목에 대해 동일한 뷰 형식을 반환하지만, 그런 당신의 presentation 변수에 의존합니다

@Override 
public int getItemViewType(int position) { 
    return presentation.equals("grid") ? 0 : 1; 
} 

또 다른 방법은 레이아웃에 두 RecyclerView의를하는 것입니다. 둘 다 동일한 어댑터를 사용할 수 있습니다. 하나는 그리드 뷰 홀더 만 생성하고 다른 하나는리스트 뷰 홀더 만 생성합니다. 그럼 당신은 그에 따라 그들을 보여주고 숨길 수 있습니다.

관련 문제