2017-03-08 155 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);