2015-08-04 20 views
8

Tôi đang tạo EPG như chế độ xem mà tôi có nhiều ngang RecyclerView s (như các chương trình truyền hình) được đóng gói bên trong LinearLayout. Khi tôi cuộn một trong các RecyclerView, tôi muốn phần còn lại của các khung nhìn được cuộn lại với nhau.Di chuyển nhiều RecyclerView ngang cùng nhau

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    layoutContent.setWeightSum(epg.getChannels().size()); 

    //prepare recycler views and add into layoutContent based on epg channels 
    for(EPG.Channel ch : epg.getChannels()){ 
     AppLog.error(TAG, "Creating RecyclerView for: " + ch.getDisplayName()); 

     //create new recycler view 
     final RecyclerView rv = new RecyclerView(layoutContent.getContext()); 
     lstRecyclerViews.add(rv); 

     //set layout manager 
     rv.setLayoutManager(new LinearLayoutManager(layoutContent.getContext(), LinearLayoutManager.HORIZONTAL, false)); 

     //create adapter 
     rv.setAdapter(new MyAdapter(ch.getPrograms())); 
     rv.setItemAnimator(new DefaultItemAnimator()); 

     //add into parent layout 
     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0); 
     lp.weight = 1; 
     layoutContent.addView(rv, lp); 
    } 
} 

Tôi đã thử thêm một người biết lắng nghe cuộn để quan điểm của tôi nhưng tôi nhầm lẫn với RecyclerView.OnScrollListener 's onScrolled phương pháp như tôi không thể tìm ra cách để di chuyển khung nhìn khác.

Bất kỳ trợ giúp/đề xuất nào đều hữu ích.

TV Channels' view

+0

không phải là StaggeredGridLayoutQuản lý nên được sử dụng ở đây? – pskink

+0

@pskink Bạn có thể đúng khi sử dụng 'LinearLayoutManager' không phải là quyết định cuối cùng :) nhưng ngay cả khi tôi sử dụng chế độ xem so le, vậy làm cách nào để cuộn tất cả các RecyclerViews cùng nhau khi một trong các chế độ xem được cuộn? – waqaslam

+0

với SGLM bạn chỉ có một RV – pskink

Trả lời

2

HorizontelScrollView

{

tuyến tính Layout

{

danh sách Vertical quan điểm tái chế ngang, ghi đè ngang xem tái chế của LayoutManager của
canScr oolhorizontally() phương thức trả về false, để chúng tất cả cuộn cùng nhau theo Grand Parent ScrollView.

}

trọng tâm chính của chúng tôi là để di chuyển mà danh sách dọc các quan điểm tái chế ngang theo chiều ngang, đầu tiên tôi đã cố gắng để giữ tất cả trong số họ trên một cái nhìn cuộn ngang, nhưng đó là một cái gì đó, mà hệ thống android từ chối rõ ràng , vì vậy tôi giữ một bố cục tuyến tính (trong trường hợp của tôi theo chiều dọc được định hướng) làm người hòa giải.

để lưới epg hiện có thể cuộn theo chiều dọc khi chúng ở trong một chế độ xem theo trình tự dọc cũng như theo chiều ngang do chế độ xem Cuộn ngang. và chúng tôi không nên cho phép danh sách ngang cuộn độc lập, vì vậy tôi đã mở rộng layoutmanager và không cho phép di chuyển ngang, giờ đây chúng chỉ cuộn dưới chế độ cuộn GrandParent.

+0

Vui lòng giải thích một chút về câu trả lời của bạn, xem: [Cách trả lời.] (Http://stackoverflow.com/help/how-to-answer) – agold

+0

@agold, cảm ơn vì phản hồi, tôi đã cố giải thích trong bản chỉnh sửa này . –

1

Bạn cần phải luôn tính toán lại vị trí của các mục hiện tại trong chế độ xem recycler ngang (next h.r.v.) Sau khi cuộn trong một h.r.v. tính toán lại vị trí của người khác dựa trên lượng chuyển động cuộn nhỏ xuất hiện trong h.r.v.

Sau đó, ghi đè onViewAttachedToWindow trong bộ điều hợp và phương pháp sử dụng scrollToPositionWithOffset từ LinearLayoutManager đặc biệt là h.r.v để đặt thành đúng vị trí.

Ngoài ra khi tính toán chuyển động dx, đừng quên tắt phương pháp onScrolledkhi ngón tay ngừng hoạt động để tránh xử lý nhiều sự kiện tương tự.

0

FlexboxLayout (do Google tạo) cho phép bạn tạo một cái gì đó như thế này với một số RecyclerViewFlexboxLayoutManager. Kể từ ngày version 3.0 (ngày 28 tháng 6 năm 2017), bạn có thể kéo theo chiều ngang qua nó.

Ví dụ bạn sử dụng nó như thế này:

FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(getActivity()); 
    layoutManager.setFlexDirection(FlexDirection.ROW); 
    layoutManager.setFlexWrap(FlexWrap.WRAP); 
    recyclerView.setLayoutManager(layoutManager); 

Và đừng quên để thiết lập chiều rộng của RecyclerView của bạn đến một số lớn hơn kích thước màn hình, để di chuyển, không sử dụng match_parent:

<android.support.v7.widget.RecyclerView 
     android:layout_width="3600dp" 
     android:layout_height="match_parent"/> 

Note: các ViewHolders được tái chế bởi hàng, chứ không phải bởi các cột, vì vậy hãy cẩn thận nếu bạn có các mục quá nặng trên rất dài RecyclerView

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