2017-07-26 11 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を使用することを検討してください。これは、アプリケーションライブラリ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

グリッド項目の周りに等しい余裕を与えますリストアイテムが左右に移動されるので、グリッドの間隔はリサイクルビューで欲しいのとまったく同じように働くと思います。左右の間隔を忘れて上下を考慮する方法はありますか? – Nero

関連する問題