2015-03-24 8 views
10

Używam tej klasy ItemDecoration dla GridLayout ->https://github.com/devunwired/recyclerview-playground/blob/master/app/src/main/java/com/example/android/recyclerplayground/GridDividerDecoration.javaJak pominąć pierwszy wiersz w recyklerze? Wyświetl element dekoracji dla GridLayout?

Ale problem jest, mój pierwszy wiersz w GridLayout jest obraz i ustawić rozpiętość do 2.

Można zobaczyć, jak na mój ekran zrzut ekranu poniżej:

Screenshot

Jak pominąć pierwszy wiersz tak, że ItemDecoration nie rysować na obrazie?

Poniżej znajduje się kod, który używam dodać ItemDecoration: -

mRecyclerView.setHasFixedSize(true); 
mLayoutManager = new GridLayoutManager(getActivity(), 2); 
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
    @Override 
    public int getSpanSize(int position) { 
     return position == 0 ? 2 : 1; 
    } 
}); 
mRecyclerView.setLayoutManager(mLayoutManager); 
mAdapter.setHighlightsCallbacks(this); 
mRecyclerView.setAdapter(mAdapter); 
mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 
mRecyclerView.addItemDecoration(new GridDividerDecoration(getActivity())); 

ja również zmodyfikowaną metodę drawHorizontal w klasie GridDividerDecoration tylko wyciągnąć jeśli ImageView jest zerowy, ale nadal nie działa: -

public void drawHorizontal(Canvas c, RecyclerView parent) { 

    final int top = parent.getPaddingTop(); 
    final int bottom = parent.getHeight() - parent.getPaddingBottom(); 

    final int childCount = parent.getChildCount(); 

    for (int i = 0; i < childCount; i++) { 
     final View child = parent.getChildAt(i); 
     if (child.findViewById(R.id.home_imgHeader) == null) { 
      final RecyclerView.LayoutParams params = 
        (RecyclerView.LayoutParams) child.getLayoutParams(); 
      final int left = child.getRight() + params.rightMargin + mInsets; 
      final int right = left + mDivider.getIntrinsicWidth(); 
      mDivider.setBounds(left, top, right, bottom); 
      mDivider.draw(c); 
     } 
    } 
} 

Każda pomoc?

+0

jakikolwiek powód oddania głosu? – skycrew

Odpowiedz

3

Zakładając, że twoje przedmioty nie mają pojedynczego tła (tj. Biały kolor pochodzi od rodzica), najprostszym rozwiązaniem byłoby przeniesienie kodu z onDrawOver() do onDraw(). Spowoduje to narysowanie linii siatki pod treścią widoku podrzędnego, która będzie ukryta pod obrazem nagłówka.

W przeciwnym razie używany kod zakłada, że ​​linie siatki zawsze są rysowane w górnej części widoku w drawHorizontal() (uwaga top jest wartością, która nigdy się nie zmienia). Trzeba będzie zmodyfikować tę funkcję, aby uwzględnić dolną część pierwszego elementu i rozpocząć rysowanie. Coś jak:

public void drawHorizontal(Canvas c, RecyclerView parent) { 
    final View topView = parent.findViewHolderForAdapterPosition(0); 
    int viewBottom = -1; 
    if (topView != null) { 
     final RecyclerView.LayoutParams params = 
      (RecyclerView.LayoutParams) child.getLayoutParams(); 
     viewBottom = child.getBottom() + params.bottomMargin + mInsets; 
    } 

    final int top = viewBottom > parent.getPaddingTop() ? viewBottom : parent.getPaddingTop(); 
    final int bottom = parent.getHeight() - parent.getPaddingBottom(); 

    … /* Remaining Code */ 
} 
+0

oba rozwiązania zmieniają się z onDrawOver na onDraw, a metoda drawHorizontal działa idealnie. Dzięki @Devunwired wciąż newbie w Androidzie. – skycrew