2013-09-22 3 views
4

제 질문은 rowSpan 및 colSpan 지원을 사용하여 GridView를 만드는 것에 대한 것입니다. 스택 오버플로 등에서 몇 가지 비슷한 질문이 있지만 유효하지 않은 답변이 있습니다.GridView 및 rowSpan이있는 GridView [Android]

이렇게하는 한 가지 방법은 다른 행 유형을 사용하는 사용자 지정 ListView 어댑터를 구현하는 것일 수 있습니다. getItemViewType (int position)을 사용하면 이러한 시나리오를 최적화하는 데 도움이 될 수 있지만 너무 많은 ViewTypes가있어 비효율적으로 재활용 할 수 있습니다. 3 cols 그리드와 4 또는 5만큼의 rowSpans를 가진 요소가 필요합니다.

또 다른 방법으로 ListView를 확장하고 해당 "카드"에 자체 리사이클 러를 만들 수 있습니다.

##..// 
    ##**// 
    ##==== 
    ##++-- 

일반적으로는 ListView에 대한 하나의 행이 될 것입니다 그러나 그것은 자신의 차일과 자신의 계층 구조를 가져야한다 : 거기에이 같은 행이 있으면 내 말은. 이 행은 정말 독특하기 때문에 결코 재사용되지 않습니다. 맞춤 리사이클 러를 사용하는 경우 위의 아스키 아트에 대한 '#', '='또는 '+'와 같은 모든 카드는 크기에 따라 고유 한 휴지통으로 이동해야합니다 (예 : '#'의 경우 4x2, '=') 재활용 가능성은 훨씬 높아질 것입니다.

ListView를 사용하지 않고 Scroller의 도움으로 완전히 새로운보기를 구현하지 않고 자체 리사이클 러와 서버 측에서 결정된 각 요소의 절대 위치를 사용하는 것이 더 좋은 아이디어 일 수 있습니다.

나는 당신에게 더 나은 아이디어가 떠오르거나 적어도 각 방법을 구현하는 데 얼마나 어려운지 조언을 해줄 것이라고 생각하기 때문에 이것을 묻습니다.

답변

0

자바 코드

private LinearLayout addNewSpannedView(Integer resourceId, ViewGroup rootElement) { 
    return (LinearLayout) ((ViewGroup) getLayoutInflater().inflate(resourceId, rootElement, true)).getChildAt(rootElement.getChildCount() - 1); 
} 
// set columnSpan depending on some logic (gridLayout is the layout to add the view's to -> in my case these are LinearLayouts) 
shape = addNewSpannedView(columnSpan == 1 ? R.layout.grid_ll_col_span_1 : R.layout.grid_ll_col_span_2, gridLayout); 

grid_ll_col_span_2.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="@dimen/shapeWidth" 
    android:layout_height="wrap_content" 
    android:layout_columnSpan="2"/>