2017-07-26 62 views
0

之间添加分隔符我试图在回收站视图中的每个列表项之间添加一些空间,但由于某些原因它不能正常工作。我一直在遵循一个指南来实现这个解决方案,但似乎无法找到答案。它增加了空间,但空间放置在下一个列表项目上。RecyclerView SimpleItemDivider不在

这是我的recyclerview目前看起来像: - My RecyclerView

这里是我的类: - divider.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 

    <size 
     android:width="40dp" 
     android:height="40dp" /> 

    <solid 
     android:color="@color/white"/> 

</shape> 

SimpleDividerItemDecoration类

public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration { 

    private Drawable mDivider; 

    public SimpleDividerItemDecoration(Context context) { 
     mDivider = ContextCompat.getDrawable(context,R.drawable.divider); 
    } 

    @Override 
    public void onDrawOver(Canvas c, 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 child = parent.getChildAt(i); 

      RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 

      int top = child.getBottom() + params.bottomMargin; 
      int bottom = top + mDivider.getIntrinsicHeight(); 

      mDivider.setBounds(left, top, right, bottom); 
      mDivider.draw(c); 
     } 
    } 
} 

onCreate方法在我我得到物品的片段类

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.fragment_popular_picks, container, false); 

     recyclerView = (RecyclerView)v.findViewById(R.id.popular_pick_recyclerView); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
     recyclerView.addItemDecoration(new SimpleDividerItemDecoration(getContext())); 

     getPopularPost(); 

     return v; 
    } 

回答

0

如果您只需要添加空间,请考虑将其添加到项目布局(列表项的.xml文件)。这可以是RecyclerView中每个项目的一些填充。

如果您需要添加正规分隔线,请考虑使用默认的DividerItemDecoration。它可从appcompat库25.0.0获得。

您可以用这种方式添加:

mDividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), 
     mLayoutManager.getOrientation()); 
recyclerView.addItemDecoration(mDividerItemDecoration); 
0

添加以下代码行,希望它能够解决您的问题

recyclerView.addItemDecoration(新GridSpacingItemDecoration(2 dpToPx(10),真) );

,这里的类GridSpacingItemDecoration

/** * 项目RecyclerView装饰 - 给周围的网格项等于利润率 */

public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { 

    private int spanCount; 
    private int spacing; 
    private boolean includeEdge; 

    public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) { 
     this.spanCount = spanCount; 
     this.spacing = spacing; 
     this.includeEdge = includeEdge; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     int position = parent.getChildAdapterPosition(view); // item position 
     int column = position % spanCount; // item column 

     if (includeEdge) { 
      outRect.left = spacing - column * spacing/spanCount; // spacing - column * ((1f/spanCount) * spacing) 
      outRect.right = (column + 1) * spacing/spanCount; // (column + 1) * ((1f/spanCount) * spacing) 

      if (position < spanCount) { // top edge 
       outRect.top = spacing; 
      } 
      outRect.bottom = spacing; // item bottom 
     } else { 
      outRect.left = column * spacing/spanCount; // column * ((1f/spanCount) * spacing) 
      outRect.right = spacing - (column + 1) * spacing/spanCount; // spacing - (column + 1) * ((1f/ spanCount) * spacing) 
      if (position >= spanCount) { 
       outRect.top = spacing; // item top 
      } 
     } 
    } 
} 

/** 
* Converting dp to pixel 
*/ 
private int dpToPx(int dp) { 
    Resources r = getResources(); 
    return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics())); 
} 
+0

我已经修改了类,但我不认为网格间距将工作完全像我想在recyclerview,因为列表项被移动到左侧和右侧。有没有办法忘记左右间距,只考虑顶部和底部? – Nero