2017-03-08 12 views
0

私は、RecyclerViewと透明なステータスバー(wifi信号などを含むもの)とソフトキーバーを含むアクティビティを持っています。もちろんRecyclerViewの項目数は定義されていません。最初の標準マージンとステータスバーの高さ、そして最後の標準マージンにソフトキーの高さを加えたものが必要です。スクロールが上端または下端にそれぞれあるときに最初と最後の項目がバーで部分的に覆われてしまうからです。ここで透明なソフトキーバーと透明なステータスバーの高さはどのようにしますか?

私はプログラム的にマージンを扱うてるかのサンプルコード:

DisplayMetrics metrics = new DisplayMetrics(); 
     activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); 

     topSpace = new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     bottomSpace = new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     standardSpace = new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 

     topSpace.setMargins( (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics), 
           (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8 + 24, metrics), 
           (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics), 
           (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics)); 

     bottomSpace.setMargins( (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics), 
           (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics), 
           (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics), 
           (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8 + 56, metrics) + 
             getSoftkeysHeight(activity)); 

     standardSpace.setMargins((int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics), 
           (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics), 
           (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics), 
           (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics)); 

私はthose answersを使用しようとしているが、画面の描画可能な表面が実際に画面全体であるので、彼らが私を助けていないようですあなたが特定のアイテムの余白を変更するためにRecyclerView.ItemDecorationを使用することができます...

Top bar is working fine Bottom not so fine...

答えて

0

  1. RecyclerView.ItemDecorationを拡張するクラスを作成します。

    final int recyclerViewItemsCount = 6; 
    final SimpleItemDecorator itemDecorator = new SimpleItemDecorator(this, recyclerViewItemsCount); 
    recyclerView.addItemDecorator(itemDecorator); 
    

public static class SimpleItemDecorator extends RecyclerView.ItemDecoration { 

private int regularMargin; 
private int lastPosition; 
private int statusBarHeight; 
private int navigationBarHeight; 

public SimpleItemDecorator(Activity activity, int recyclerViewItemsCount) { 
    // get the regular margin 
    regularMargin = activity.getResources().getDimensionPixelSize(R.dimen.regularMargin); 

    // determine the last position 
    lastPosition = recyclerViewItemsCount - 1; 

    // get the height of the status bar 
    final Rect rectangle = new Rect(); 
    final Window window = activity.getWindow(); 
    window.getDecorView().getWindowVisibleDisplayFrame(rectangle); 
    statusBarHeight = rectangle.top; 

    // get the height of the navigation bar 
    final int redId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); 
    navigationBarHeight = (redId > 0) ? resources.getDimensionPixelSize(resId) : 0; 

} 

@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    // modify the margins 
    final int position = parent.getChildAdapterPosition(view); 
    if (position == 0) { 
     outRect.top = statusBarHeight + regularMargin; 
    } else if (position == lastPosition) { 
     outRect.bottom = navigationBar + regularMargin; 
    } 
} 

}

  • をRecyclerViewに作成したItemDecoratorを追加します。

  • 関連する問題