2016-02-03 12 views
11

Tôi đang sử dụng bố cục chế độ xem trình thu thập so le cho một danh sách ảnh. Tôi muốn khoảng cách ở hai bên bằng không trong khi vẫn còn khoảng cách giữa hai cột. Tôi đang sử dụng một lớp phụ trang trí mục để có khoảng cách được nhìn thấy trong ảnh đính kèm. Tôi biết tôi có quyền kiểm soát khoảng cách bên trái và bên phải nhưng vấn đề là tôi không bao giờ biết được hình ảnh của cột đó. Có vẻ như trình quản lý bố cục bị so le thực hiện một số sắp xếp lại của riêng nó. Tôi đã thử sử dụng getChildAdapterPosition nhưng có vẻ như trả về vị trí trong mảng nguồn dữ liệu chứ không phải vị trí thực tế của ảnh trong bố cục. Bất kỳ ý tưởng làm thế nào tôi nên tiếp cận này? enter image description hereCách xác định vị trí cột trong trình quản lý bố cục lưới so le

+0

Đó là những gì tôi hiện đang cố gắng tìm ra. Người quản lý đặt các khung nhìn tùy thuộc vào kích thước của chúng, và bạn sẽ không bao giờ chắc chắn rằng ví dụ các vị trí lẻ sẽ nằm ở bên trái và ngay cả các vị trí sẽ nằm ở bên phải. Đó là cách tôi cố gắng giải quyết nó trong trang trí mục của tôi, bằng cách kiểm tra vị trí% 2 == 0 và sau đó đặt lề rect.left ... nhưng nó không hoạt động như vậy vì trong một số trường hợp, mục có vị trí 6 có thể nằm trên bên phải và đôi khi ở bên trái. – Tooroop

Trả lời

24

Tôi đã cố gắng làm cho nó hoạt động. Vì vậy, trong trường hợp của tôi, tôi không cần bất kỳ biên giới trên các cạnh bên trái và bên phải của màn hình sau đó. Tôi chỉ cần biên giới ở giữa và ở phía dưới. Giải pháp là lấy các tham số bố cục của khung nhìn có kiểu StaggeredGridLayoutManager.LayoutParams. Trong các tham số đó, bạn có thể nhận được spanIndex cho bạn biết chỉ mục nào là view. Vì vậy, nếu bạn có một spanCount 2, quan điểm trái sẽ có một spanIndex từ 0 và chánh kiến ​​sẽ có một spanIndex của 1.

Đây là mã của tôi như vậy có lẽ nó sẽ giúp bạn

public class SpaceItemDecoration extends RecyclerView.ItemDecoration { 
private int space; 

public SpaceItemDecoration(int space) { 
    this.space = space; 
} 


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

    StaggeredGridLayoutManager.LayoutParams lp = (StaggeredGridLayoutManager.LayoutParams)view .getLayoutParams(); 
    int spanIndex = lp.getSpanIndex(); 

    if(position > 0){ 
     if(spanIndex == 1){ 
      outRect.left = space; 
     } else{ 
      outRect.right = space; 
     } 

     outRect.bottom = space * 2; 
    } 
} 

}

Trong trường hợp của tôi đầu tiên tôi phải lấy vị trí từ chỉ mục 0 Tôi có chế độ xem tiêu đề không có bất kỳ đường viền nào. Sau đó tôi nhận được chỉ số nhịp và tùy thuộc vào nó, tôi thiết lập đường viền mà tôi cần trên khung nhìn đó. Và cuối cùng, tôi đặt đường viền dưới cùng trên mỗi chế độ xem.

+0

Cảm ơn bạn, tôi đã cố gắng để hack này cho bố trí của tôi, trong đó có một loại xem tiêu đề, loại xem tiêu đề phụ và loại xem mục.Đây là giải pháp thực sự thanh lịch và cũng hoạt động với GridLayoutManager thông thường. – kvgr

+0

Bạn có ví dụ làm việc về mã này không? Tôi đã cố gắng trong dự án của tôi, vì một số lý do tôi không hiểu, spanIndex luôn luôn là 0. Có vẻ như StaggeredGridLayoutManager gọi getItemOffsets trước khi nó quyết định khoảng thời gian mà view con thuộc về. – LiuJian

+0

Nó hoạt động như một nét duyên dáng ................... – Vicky

2

vì vậy một giải pháp tôi có thể sử dụng là với một công cụ trang trí mặt hàng nhưng nó chắc chắn là một cảm giác kỳ quặc/khó hiểu.

Về cơ bản, bạn sẽ điều chỉnh hình chữ nhật ngoài của mục dựa trên vị trí cột của nó (hoặc thứ gì đó tương tự). Sự hiểu biết của tôi là hình chữ nhật bên ngoài là nhiều hay ít khoảng cách bạn muốn thay đổi. Cho đoạn code dưới đây thử xem, rõ ràng là bạn sẽ cần phải thực hiện điều chỉnh và logic của riêng bạn để 'tính toán' mà cột mục trên nhưng điều này cũng đủ để hình dung nó ra, hy vọng:

recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { 
     public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
      int left = outRect.left; 
      int right = outRect.right; 
      int top = outRect.top; 
      int bottom = outRect.bottom; 
      int idx = parent.getChildPosition(view); 
      int perRow = gridLayoutManager.getSpanCount(); 

      int adj = blahh... // some adjustment 

      if (idx < itemsPerRow) { 
       // on first row, adjust top if needed 
      } 

      if(idx % perRow == 0){ 
       // on first column, adjust. Left magically adjusts bottom, so adjust it too... 
       left += adj; 
       bottom -= adj; 
      } 

      if(idx % itemsPerRow == perRow - 1){ 
       // on last column, adjust. Right magically adjusts bottom, so adjust it too... 
       right += adjustment; 
       bottom -= adjustment; 
      } 

      outRect.set(left, top, right, bottom); 
     } 
    }); 

Again này là hacky và mất một số thử nghiệm và lỗi để có được quyền.

Một giải pháp khác mà tôi đã thử với một số thành công là xác định các chế độ xem khác nhau cho các cột khác nhau. Trong trường hợp của bạn, các cột sẽ có lượt xem với các lề khác nhau, tiêu cực, ở bên trái và bên phải để có được hiệu ứng bạn muốn.

Lưu ý phụ, tôi cho rằng bạn đang sử dụng độ cao trên chế độ xem thẻ. Một điều tôi đã nhận thấy là nếu xem thẻ không có độ cao và thay vào đó bạn xử lý nó cho mình (yeah, tôi biết, không phải là điểm để không xử lý độ cao chính mình) nhiều khó khăn này biến mất và mọi thứ bắt đầu cư xử , có thể do tính toán độ cao/bóng. Nhưng dù sao ... Hy vọng điều này là ít nhất một chút hữu ích ...

+0

Hey, nơi 'itemsPerRow'instantiated? Cảm ơn bạn –

Các vấn đề liên quan