2017-07-01 2 views
0

Ich versuche, GUI für eine App in Android machen Ich bin Anfänger in diesem.Add DividerItemDecoration beide Seiten von RecyclerView

Zuerst mache ich eine horizontale recyclerView, fügen DividerItemDecoration mit einem benutzerdefinierten Zeichen und Setup LinearSnapHelper für immer Snap in der Mitte.

Es funktioniert, aber die linke Seite ist neben der Seite des Bildschirms, weil dividerItemDecorator nur die Linie zwischen Elementen setzen.

enter image description here

Exists jede mögliche Weise Teiler am Anfang der recycler zu setzen, ich habe etwas Padding oder Margin setzen versucht, aber wenn ich es schieben „schneidet“, bevor das Ende des Bildschirms

Leider erreichen in vorzurücken für die englische

Mein Code

MainActivity ist

@BindView(R.id.rvRecentNews) 
RecyclerView rvRecentNews; 
private ArrayList<String> horizontalList; 
private HorizontalAdapter horizontalAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_activity); 
    ButterKnife.bind(this); 

horizontalList=new ArrayList<>(); 
    horizontalList.add("horizontal 1"); 
    horizontalList.add("horizontal 2"); 
    horizontalList.add("horizontal 3"); 
    horizontalList.add("horizontal 4"); 
    horizontalList.add("horizontal 5"); 
    horizontalList.add("horizontal 6"); 
    horizontalList.add("horizontal 7"); 
    horizontalList.add("horizontal 8"); 
    horizontalList.add("horizontal 9"); 
    horizontalList.add("horizontal 10"); 

    horizontalAdapter=new HorizontalAdapter(horizontalList); 

    LinearLayoutManager horizontalLayoutManagaer 
      = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false); 
    rvRecentNews.setLayoutManager(horizontalLayoutManagaer); 

    DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(rvRecentNews.getContext(), 
      horizontalLayoutManagaer.getOrientation()); 
    dividerItemDecoration.setDrawable(getApplicationContext().getResources().getDrawable(R.drawable.line_divider)); 

    rvRecentNews.addItemDecoration(dividerItemDecoration); 

    SnapHelper helper = new LinearSnapHelper(); 
    helper.attachToRecyclerView(rvRecentNews); 

    rvRecentNews.setAdapter(horizontalAdapter); 


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
app:layout_behavior="@string/appbar_scrolling_view_behavior" 
android:orientation="vertical" 
tools:context="com.sgd.pawfriends.MainActivity" 
tools:showIn="@layout/app_bar_main"> 

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.v7.widget.RecyclerView 
      android:layout_marginTop="8dp" 
      android:id="@+id/rvRecentNews" 
      android:layout_width="match_parent" 
      android:layout_height="200dp" 

      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

    </LinearLayout> 

</ScrollView> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="salir" 
    android:onClick="logout" 
    /> 

</LinearLayout> 

Vielen Dank im Voraus

+0

Sie benutzerdefinierte erstellen müssen erstellen 'ItemDecoration' –

Antwort

0

Try this:

<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clipToPadding="false" 
    android:paddingLeft="10dp"/> 

clipToPadding="false" Mittel, nur Clip beim Scroll/Punkt beginnen zu Ende erreicht.

+0

es aber nur das erste Element arbeitet, die andere und die res Elemente nicht die Änderung anwenden. Danke für die Hilfe –

+0

@SebastianDaza hast du DividerItemDecorator entfernt? Sie müssen zusammen Padding und DividerItemDecorator verwenden. Ich habe es vorher gesagt, clipToPadding funktioniert nur für Start-/Endpunkte. –

+0

Ich versuche beide Option, entfernen DividerItemDecorator und damit, aber das Problem ist mit Hinzufügen von Android: ClipToPadding und DividerItemDecorator ist, wenn ich LinearSnapHelper hinzufügen, weil inneres Element Snap zu zentrieren, sondern weil die Polsterung nur das erste und letzte Element beeinflussen die anderen nicht richtig einrasten –

0

ich in dieser Seite viele Möglichkeiten für ItemDecoration

https://www.bignerdranch.com/blog/a-view-divided-adding-dividers-to-your-recyclerview-with-itemdecoration/

individuelle implementieren und i nur

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(rvRecentNews.getContext(), 
      horizontalLayoutManagaer.getOrientation()); 

    dividerItemDecoration.setDrawable(ContextCompat.getDrawable(this,R.drawable.line_divider)); 

    rvRecentNews.addItemDecoration(dividerItemDecoration); 

für dieses

rvRecentNews.addItemDecoration(new StartOffsetItemDecoration(ContextCompat.getDrawable(this,R.drawable.line_divider))); 

Klasse StartOffsetItemDecoration

ändern
public class StartOffsetItemDecoration extends RecyclerView.ItemDecoration { 

private int mOffsetPx; 
private Drawable mOffsetDrawable; 
private int mOrientation; 


public StartOffsetItemDecoration(int offsetPx) { 
    mOffsetPx = offsetPx; 
} 

public StartOffsetItemDecoration(Drawable offsetDrawable) { 
    mOffsetDrawable = offsetDrawable; 
} 


@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    super.getItemOffsets(outRect, view, parent, state); 


    mOrientation = ((LinearLayoutManager) parent.getLayoutManager()).getOrientation(); 
    if (mOrientation == LinearLayoutManager.HORIZONTAL) { 
     if (mOffsetPx > 0) { 
      outRect.left = mOffsetPx; 
      outRect.right = mOffsetPx; 
     } else if (mOffsetDrawable != null) { 
      outRect.left = mOffsetDrawable.getIntrinsicWidth(); 
      outRect.right = mOffsetDrawable.getIntrinsicWidth(); 
     } 
    } else if (mOrientation == LinearLayoutManager.VERTICAL) { 
     if (mOffsetPx > 0) { 
      outRect.top = mOffsetPx; 
     } else if (mOffsetDrawable != null) { 
      outRect.top = mOffsetDrawable.getIntrinsicHeight(); 
     } 
    } 
} 

@Override 
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { 
    super.onDraw(c, parent, state); 
    if (mOffsetDrawable == null) { 
     return; 
    } 

    if (mOrientation == LinearLayoutManager.HORIZONTAL) { 
     drawOffsetHorizontal(c, parent); 
    } else if (mOrientation == LinearLayoutManager.VERTICAL) { 
     drawOffsetVertical(c, parent); 
    } 
} 


private void drawOffsetHorizontal(Canvas canvas, RecyclerView parent) { 
    int parentTop = parent.getPaddingTop(); 
    int parentBottom = parent.getHeight() - parent.getPaddingBottom(); 
    int parentLeft = parent.getPaddingLeft(); 
    int offsetDrawableRight = parentLeft + mOffsetDrawable.getIntrinsicWidth(); 

    mOffsetDrawable.setBounds(parentLeft, parentTop, offsetDrawableRight, parentBottom); 
    mOffsetDrawable.draw(canvas); 
} 

private void drawOffsetVertical(Canvas canvas, RecyclerView parent) { 
    int parentLeft = parent.getPaddingLeft(); 
    int parentRight = parent.getWidth() - parent.getPaddingRight(); 
    int parentTop = parent.getPaddingTop(); 
    int offsetDrawableBottom = parentTop + mOffsetDrawable.getIntrinsicHeight(); 

    mOffsetDrawable.setBounds(parentLeft, parentTop, parentRight, offsetDrawableBottom); 
    mOffsetDrawable.draw(canvas); 
} 

Dank Autor des Posts David Greenhalgh und Shayan Pourvatan für die Idee benutzerdefinierte Klasse

Verwandte Themen