2017-03-29 4 views
0

So habe ich eine ListView mit verschiedenen Arten von Zeilen. Ich möchte den Teiler für die erste Zeile deaktivieren und einen anderen Teiler für den zweiten Teil haben.RecyclerView, verschiedene Teiler abhängig vom Typ der Zeile

Was ist die beste Vorgehensweise, um das zu tun?

Ich addiere Teiler derzeit von:

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),DividerItemDecoration.VERTICAL); 
    dividerItemDecoration.setDrawable(getDrawable(R.drawable.divider)); 
    recyclerView.addItemDecoration(dividerItemDecoration); 

enter image description here

Antwort

1

Ich habe dies auf folgende Weise geschehen.

Hinweis: In meiner Lösung ist der Teiler Teil der Objektansicht, Sie können stattdessen einen Hintergrund festlegen oder eine Linie zeichnen, oder fügen Sie einen unteren Rand hinzu und lassen Sie den Raum den Hintergrund und damit eine Trennwand usw. Ich empfehle den Blick auf die ItemDecoration API. Ich zeige Ihnen nur, wie Sie in ItemDecoration bestimmen, was Sie tun möchten.

Zuerst in Ihrem Adapter:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    ... 
    if (mData.get(postion) instanceof ObjectA) 
     holder.itemView.setTag(R.id.noSpaceAfter, Boolean.TRUE); 
    else 
     holder.itemView.setTag(R.id.noSpaceAfter, Boolean.FALSE); 
    ... 
} 

Dann in Ihrem RecyclerView erklären eine ItemDecoration

mRecyclerView.addItemDecoration(new MyDividerItemDecoration()); 

Schließlich definieren Sie Ihre MyDividerItemDecorator

public class MyDividerItemDecoration extends RecyclerView.ItemDecoration { 
    public MyDividerItemDecoration() { 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, 
           RecyclerView.State state) { 
     Boolean noSpace = (Boolean) view.getTag(R.id.noSpaceAfter); 
     View v = view.findViewById(R.id.view_sep); 
     if (v != null) { 
      if (noSpace == null || !noSpace) { 
       v.setVisibility(View.VISIBLE); 
      } else { 
       v.setVisibility(View.INVISIBLE); 
      } 
     } 
    } 
} 

dies mit im Auge, Sie kann nur die Quelle für DividerItemDecoration und th kopieren Wenn Sie in der Schleife drawVertical aufrufen, überprüfen Sie, ob R.id.noSpaceAfter wahr oder falsch ist, und überspringen Sie die Zeichnung entsprechend.

1

Versuch in Ihrer Reihe XML-Datei am unteren Rande des Layouts und definiert erforderlich layout_height und setzt layout_width = "match_parent" und versteckt Blick auf bestimmtem Index dass Sie

EG-

`<View 
    android:id="@+id/view_divider"  
    android:layout_width="match_parent"  
    android:layout_height="@dimen/one" 
    android:background="@color/grey_divider_color"/>` 
+0

Vielen Dank, es funktioniert als schnelle Lösung, aber ich ziehe robustere ein. – qbait

0

mögen hinzufügen @ Ali Ich mag deine Lösung. Ihr Code erfordert jedoch Teiler in einem Layout. Ich löste es, indem ich den normalen Teiler versteckte. Danke für den Hinweis trotzdem. Hier ist meine Klasse:

public class DividerItemDecoration extends RecyclerView.ItemDecoration { 

private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; 

private Drawable divider; 

/** 
* Default divider will be used 
*/ 
public DividerItemDecoration(Context context) { 
    final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS); 
    divider = styledAttributes.getDrawable(0); 
    styledAttributes.recycle(); 
} 

/** 
* Custom divider will be used 
*/ 
public DividerItemDecoration(Context context, int resId) { 
    divider = ContextCompat.getDrawable(context, resId); 
} 

@Override 
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { 
    int left = parent.getPaddingLeft(); 
    int right = parent.getWidth() - parent.getPaddingRight(); 

    int childCount = parent.getChildCount(); 
    for (int i = 0; i < childCount; i++) { 
     View row = parent.getChildAt(i); 
     Boolean noDivider = (Boolean) row.getTag(R.id.noSpaceAfter); 

     if (noDivider == null || !noDivider) { 
      drawDivider(canvas, row, left, right); 
     } 
    } 
} 

private void drawDivider(Canvas canvas, View row, int left, int right) { 
    RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) row.getLayoutParams(); 

    int top = row.getBottom() + params.bottomMargin; 
    int bottom = top + divider.getIntrinsicHeight(); 

    divider.setBounds(left, top, right, bottom); 
    divider.draw(canvas); 
} 

}

+0

Wie ich bereits erwähnt habe, kann ich Ihnen zeigen, wie Sie in ItemDecoration bestimmen, was Sie tun müssen, ich erwähnte sogar die genaue Vorgehensweise, die Sie am unteren Rand genommen haben. Bitte akzeptieren Sie die Antwort als die richtige Antwort, wenn es Ihnen geholfen hat. – Ali

Verwandte Themen