2015-03-24 4 views
10

Ich verwende diese ItemDecoration Klasse für Gridlayout ->https://github.com/devunwired/recyclerview-playground/blob/master/app/src/main/java/com/example/android/recyclerplayground/GridDividerDecoration.javaWie wird die erste Zeile in RecyclerView Item Decoration für GridLayout übersprungen?

Aber das Problem ist, meine erste Zeile in Gridlayout ist ein Bild und ich die Spanne bis 2.

Sie können die LCD-Display als pro ansehen Abbildung unten:

Screenshot

Wie die erste Zeile zu überspringen, so dass ItemDecoration nicht auf dem Bild gezogen hat?

Unten ist der Code, dass ich die ItemDecoration hinzufügen bin mit: -

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())); 

Ich arbeite auch die drawHorizontal Methode in GridDividerDecoration Klasse modifiziert nur zu ziehen, wenn Imageview null ist, aber immer noch nicht: -

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); 
     } 
    } 
} 

Irgendwelche Hilfe?

+0

ein Grund für down-Stimmen ?? – skycrew

Antwort

3

Angenommen, Ihre Objekte haben keinen festen Hintergrund (d. H. Die weiße Farbe stammt vom übergeordneten Element), wäre die einfachste Lösung, den Code von onDrawOver() zu onDraw() zu verschieben. Dadurch werden die Gitternetzlinien unter den Inhalt der untergeordneten Ansicht gezeichnet und unter dem Headerbild verborgen.

Andernfalls setzt der von Ihnen verwendete Code voraus, dass die Rasterlinien immer in drawHorizontal() an den Anfang der Ansicht gezogen werden (notice top ist ein Wert, der sich nie ändert). Sie müssten diese Funktion ändern, um das Ende des ersten Elements zu berücksichtigen und mit dem Zeichnen zu beginnen. So etwas wie:

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

beide Lösungen ändern von onDrawOver zu onDraw und drawHorizontal-Methode funktioniert einwandfrei. Danke @Devunwired Ich bin immer noch Neuling in Android. – skycrew