17

Tôi đang cố gắng để điền vào một số dữ liệu vào một RecyclerView với GridLayoutManager:Làm thế nào tôi có thể điền RecyclerView với GridLayoutManager từ phải sang trái

GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false); 

này sẽ điền dữ liệu vào lưới từ trái sang phải. Mục đầu tiên sẽ được đặt ở vị trí trên cùng bên trái, v.v.

Nhưng ứng dụng tôi đang phát triển được thiết kế cho ngôn ngữ RTL, vì vậy tôi cần điền nó từ từ phải sang trái.

Tôi đã cố thay đổi đối số cuối cùng thành true. Nhưng nó chỉ di chuyển các RecyclerView tất cả các con đường xuống.

Ngoài ra thiết layoutDirection thuộc tính cho RecyclerView không hoạt động (mà không xem xét rằng phút API của tôi là 16 và thuộc tính này được thêm vào cho API17 +):

<android.support.v7.widget.RecyclerView 
     android:id="@+id/grid" 
     android:layoutDirection="rtl" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

Làm thế nào tôi có thể tạo ra một phải sang trái lưới điền sử dụng RecyclerView?

+0

Vui lòng thử sử dụng android: rotationY =" 180 "đầu tiên –

+0

bạn có thể đạt được điều này bằng hoạt ảnh .. –

+0

vui lòng kiểm tra câu trả lời này: [link] (https://stackoverflow.com/questions/31728837/recyclerview-grow-element-from-right-to-left/46315909 # 46315909) –

Trả lời

43

Tạo một lớp mà kéo dài GridLayoutMAnager, và ghi đè lên các phương pháp isLayoutRTL() như thế này:

public class RtlGridLayoutManager extends GridLayoutManager { 

    public RtlGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    public RtlGridLayoutManager(Context context, int spanCount) { 
     super(context, spanCount); 
    } 

    public RtlGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) { 
     super(context, spanCount, orientation, reverseLayout); 
    } 

    @Override 
    protected boolean isLayoutRTL(){ 
     return true; 
    } 
} 
+3

Cảm ơn Mohammad! Giải quyết vấn đề đẹp mắt. –

+0

Cảm ơn! Trên thực tế, ['isLayoutRTL()'] (https://developer.android.com/intl/zh-tw/reference/android/support/v7/widget/LinearLayoutManager.html#isLayoutRTL()) là một phương pháp được bảo vệ tài liệu ** GridLayoutManager **, do đó giải pháp này tương thích về phía trước. –

+0

Cảm ơn Mohammad, điều đó thật tuyệt. –

1

Khi đối mặt với nó, GridLayouManager phải fill rows from right khi getLayoutDirection() cung cấp ViewCompat.LAYOUT_DIRECTION_RTL. Thông thường, hướng này sẽ được kế thừa từ vùng chứa RecyclerView's. Nhưng nếu điều này không hoạt động như mong đợi hoặc bạn cần đẩy nó xuống API 16 hoặc bạn một số thiết bị có hỗ trợ RTL không tốt, bạn có thể chỉ cần kéo GridLayoutManager từ github và sử dụng trình quản lý tùy chỉnh bạn điều chỉnh theo ý thích của bạn.

Có thể đủ để mở rộng chứng khoán GridLayoutManager và ghi đè layoutChunk().

+0

Tôi không thể ghi đè lên vì nó có thể nhìn thấy gói. Ngoài ra tôi không thể tìm thấy phương pháp này đang được sử dụng. Nhưng nó có vẻ đầy hứa hẹn. –

+1

Điều gì có thể ngăn cản bạn bắt đầu trình quản lý tùy chỉnh của bạn bằng câu lệnh 'package android.support.v7.widget;'? –

+1

Cảm ơn Alex. Không biết điều đó. Nó thực sự rất dễ dàng để bỏ qua vấn đề. Cảm ơn các manh mối. –

-4

của nó rất đơn giản, chỉ cần gọi phương pháp setReverseLayout như,

GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false); 
layoutManager.setReverseLayout(true); 
+3

Điều này sẽ làm cho nó lộn ngược! – Ammar

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