2015-05-02 31 views
28

Tôi cần căn giữa các phần tử trong mỗi hàng để chúng giống như trong mô hình này. Tôi đã tìm kiếm nếu có bố cục nào hoạt động theo cách đó mà không cần nhìn. các mục được căn giữa trong hàng của chúng.Làm cách nào để căn giữa các mục của recyclerview?

mockup

Đây là cách nó bây giờ có trong mã của tôi. enter image description here

+0

Nó có vẻ khá giống với http://stackoverflow.com/questions/34206078/center-a-cardview-in-a-recyclerview-with-only-one-element –

+0

Vấn đề này đã được giải quyết chưa? –

+0

bạn có thể chỉ cần tạo một LayoutManager tùy chỉnh vì GridLayoutManager không hỗ trợ điều này. Tôi đã đăng một câu trả lời nhưng tôi không chắc chắn nếu nó chính xác những gì bạn đang tìm kiếm. – Mo1989

Trả lời

22

của bạn Hãy LinearLayout trong RecyclerView của bạn Bố cục hàng của mục sau đó cung cấp cho android:layout_gravity="center" đến LinearLayout.

Đối với mỗi hàng hình ảnh bạn phải thực hiện khác nhau LinearLayout.

Đây là mã ví dụ:

<LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:orientation="horizontal"> 

      <ImageView 
       android:id="@+id/image1" 
       android:layout_width="64dp" 
       android:layout_height="64dp" 
       android:layout_marginRight="10dp" 
       android:layout_weight="1" 
       android:src="@drawable/image1" /> 

      <ImageView 
       android:id="@+id/image2" 
       android:layout_width="64dp" 
       android:layout_height="64dp" 
       android:layout_marginLeft="10dp" 
       android:layout_marginRight="10dp" 
       android:layout_weight="1" 
       android:src="@drawable/image2" /> 

      <ImageView 
       android:id="@+id/image3" 
       android:layout_width="64dp" 
       android:layout_height="64dp" 
       android:layout_marginLeft="10dp" 
       android:layout_marginRight="10dp" 
       android:layout_weight="1" 
       android:src="@drawable/image3" /> 

    </LinearLayout> 
+0

Tôi phải chỉnh sửa RecyclerView layout_width = "wrap_content" thay vì match_parent cũng như – jernkuan

+0

@jemkuan Điều đó sẽ vô hiệu hóa cuộn khi người dùng vuốt trên mép hoặc vùng ngoài của bố mẹ, vì chiều rộng của RecyclerView sẽ nhỏ hơn chiều rộng của phụ huynh. –

7

Tôi giả định rằng bạn đang sử dụng LinearLayoutManager với hiệu ứng RecyclerView cho hiệu ứng kiểu ListView. Trong trường hợp đó, hãy sử dụng horizontalLinearLayout cho mỗi hàng, với android:gravity="center" để căn giữa nội dung của nó.

+0

Thực ra tôi đang sử dụng gridlayout nhưng hãy để tôi thử điều đó. –

+2

@cgomezmendez: Tôi cho rằng sẽ có một số cách để thực hiện điều đó thông qua 'GridLayoutManager', hoặc thông qua' RecyclerView.LayoutManager' tùy chỉnh. Tôi không thấy, trong nháy mắt, làm thế nào để làm điều đó với 'GridLayoutManager'. – CommonsWare

+0

bạn đã khắc phục được sự cố chưa? –

-1

đặt recyclerview của bạn trong linearlayout trong xml. và sử dụng (cho cả recyclerview và LinearLayout)

android:layout_gravity="center"

và chiều rộng của recyclerview nên wrap_content khi LinearLayout nên có math_parent và bạn phải xác định chiều rộng cho row_item

+0

điều này sẽ không giúp anh ta. Các phần tử con cần được căn giữa, nằm trong Gridlayout. –

3

bạn có thể thêm một số bố trí tự động, ví dụ:

  • đối tượng bộ chuyển đổi có thể là một LinearLayout ngang

1- tạo ra một LinearLayout trong mã java và tùy chỉnh nó (trọng lực, ...)

2- thêm một số biểu tượng để LinearLayout

3- thêm LinearLayout để adapter của bạn

4- lặp lại 1,2,3


// : declare new horizontal linearLayout 
    ImageView myIcons[nomOfIcons]; 
    // : add all icons to myIcons 
    for(int i=1; i<=nomOfIcons; i++){ 
     linearLayout.addView(myIcons[i - 1]); 
     if(i%numOfIconsInOneHorizontalLinearLayout==0) { 
      results.add(linearLayout); // add linearLayout to adapter dataSet 
      // : declare new horizontal linearLayout 
     } 
    } 
    if(n%numOfIconsInOneHorizontalLinearLayout!=0) // add last linearLayout if not added in the loop 
     results.add(linearLayout); 
    mAdapter.notifyDataSetChanged(); // update adapter 

0

Sử dụng gridLayoutManager = new GridLayoutManager(context,6) và ghi đè setSpanSizeLookup .

Ví dụ:

int totalSize=list.size(); 
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
        @Override 
        public int getSpanSize(int position) { 
         int span; 
         span = totalSize % 3; 
         if (totalSize < 3) { 
          return 6; 
         } else if (span == 0 || (position <= ((totalSize - 1) - span))) { 
          return 2; 
         } else if (span == 1) { 
          return 6; 
         } else { 
          return 3; 
         } 
        } 
       }); 

Điều này sẽ có tác dụng nếu bạn muốn hiển thị 3 mục trong một hàng và còn lại ở trung tâm của lưới điện.

Thay đổi khoảng thời gian trình quản lý bố cục lưới tính theo yêu cầu của bạn.

15

Make recyclerview width-wrap_content và bình chứa của layout_gravity để center_horizontal

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycrer_view" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:paddingLeft="16dp" 
      android:paddingRight="16dp" /> 
</LinearLayout> 
1

bạn có thể sử dụng LayoutManager mới từ google FlexLayoutManager nó sẽ cung cấp cho bạn rất nhiều điều khiển và linh hoạt hơn các mục recyclerView

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