2017-03-08 181 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,但他们似乎没有帮助我,因为屏幕的绘图表面确实是整个屏幕...

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

回答

0

您可以使用RecyclerView.ItemDecoration修改具体项目的利润率。

  1. 创建扩展RecyclerView.ItemDecoration类:

    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; 
        } 
    } 
    

    }

  2. 添加创建ItemDecorator到RecyclerView:

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