2016-08-31 25 views
23

Tôi hiện đang sử dụng một số điện thoại RecyclerView thông thường với GridLayoutManager với các khác nhau spanCount xóa trên viewType cho ứng dụng Android TV. Tất cả đều hoạt động bình thường nhưng tôi có 2 vấn đề:Android TV RecyclerView tương tác tập trung

  1. Nếu bạn nhấn lâu xuống để cuộn nhanh giữa các mục đôi khi tiêu điểm bị mất thành chế độ xem không phải là con của RecyclerView.
  2. Làm cách nào để có thể cho biết RecyclerView để giữ chế độ xem được lấy nét hiện tại ở giữa lưới?

Dường như các vấn đề được liệt kê được cố định bằng cách sử dụng các VerticalGridView từ LeanBack thư viện nhưng LayoutManger mà nó sử dụng là nội bộ và không hỗ trợ spanCount.

+0

Trả lời câu hỏi đầu tiên, hãy xem [post] (https: // stackoverflow).com/a/48309162/4770877) – yoAlex5

Trả lời

1

Recycler xem hoạt động tốt với các giải pháp TV.Possible android bạn có thể bao gồm như sau:

1.add thể đặt tiêu điểm và focusableInTouchode để view.Add focusListner qua mã và yêu cầu tập trung mỗi lần khi xem được nhấp.

2.Để giữ Recycler Xem mục lấy nét ở giữa, bạn phải ghi đè trình quản lý bố cục giống như ví dụ này.

RecyclerView smoothScroll to position in the center. android

hoặc

sử dụng layoutManager.scrollToPositionWithOffset (vị trí, bù đắp), nơi vị trí tập trung vào xem vị trí và bù đắp là quan điểm tái chế chiều rộng/2.

+0

Cảm ơn câu trả lời. Cuối cùng tôi đã sử dụng 'VerticalGridView' từ thư viện leanback nhưng có vẻ như giải pháp của bạn sẽ hoạt động. –

+0

Chào mừng bạn nhất.VersionGridView hoặc mở rộng RowFragment cũng có thể cho phép bạn đạt được hiệu ứng tương tự như chế độ xem của trình tái chế nhưng nhược điểm là bạn không thể tùy chỉnh nó theo cách bạn muốn. – Anonymous

0

Bạn có thể thử kiểm tra điều này workaround cho bug với RecycleView cuộn tiêu điểm khi điều hướng bằng d-pad.

Đây là số SO question cho điều đó.

Vấn đề ở đây là GridLayoutManager sử dụng LinearLayoutManager 's triển khai onFocusSearchFailed() được gọi khi tiêu điểm tiếp cận đường viền trong của RecyclerView. LinearLayoutManager's triển khai chỉ cung cấp phần tử đầu tiên/cuối cùng (phụ thuộc vào hướng cuộn). Do đó, tập trung nhảy đến phần tử đầu tiên/cuối cùng của hàng mới.

Vì vậy, có thể cách giải quyết này sẽ giải quyết vấn đề của bạn hoặc cung cấp cho bạn ý tưởng về cách giải quyết vấn đề của bạn.

+0

Cảm ơn bạn đã trả lời, nhưng tôi đã đọc về những câu trả lời đó. 'v24.2.0' mà tôi đang sử dụng nhảy đến cột đúng nếu bạn cuộn xuống. 2 vấn đề chính mà tôi có là: 1) Tôi cần chế độ xem tập trung mới để căn giữa trong danh sách (ngay bây giờ khi bạn cuộn trình quản lý bố cục tạo Chế độ xem và cuộn mới để nó trở nên hoàn toàn có thể nhìn thấy nhưng tôi cần nó tập trung trong RecyclerView). 2) Nếu bạn di chuyển thật nhanh, tiêu điểm sẽ nhảy đến một khung nhìn trên đầu RecyclerView nếu layoutManagers không tìm thấy một khung nhìn mới đủ nhanh (hoặc tôi không hoàn toàn chắc chắn tại sao lại là trường hợp này). –

+0

'VerticalGridView' từ leanback dường như giải quyết vấn đề của tôi nhưng tiếc là layoutManager nó sử dụng là gói được bảo vệ (tôi không thể truy cập bất kỳ thứ gì liên quan đến nó; tôi có thể sao chép mã nguồn nhưng không thích ý tưởng) + nó không hỗ trợ 'setSpanSizeLookup'. Cách duy nhất để sử dụng nó là một 'ListView' + một ô' GridLayout' để trông giống như một lưới. Việc thực hiện dường như làm việc tốt đẹp nhưng tôi yêu cầu cho một giải pháp thanh lịch hơn (hoặc tùy chỉnh một). Tôi đã không quản lý để tìm bất kỳ libs/dẫn cho việc này. –

+0

Một tùy chọn khác mà tôi hiện đang sử dụng là A DPad Aware Recycler View từ đây. Nó xử lý tập trung khá tốt nhưng nút nghiền không tốt bằng các thư viện leanback, nhưng nó là mã nguồn mở và bạn có thể sửa đổi và đóng góp lại cho nó. https://github.com/vganin/dpad-aware-recycler-view – kingargyle

0
  1. Đối với một RecyclerView thường xuyên, tôi đã phải ghi rõ:

    android: descendantFocusability = "beforeDescendants"

cũng android: nextFocusDown = "@ + id/recyclerviewId" được thiết lập để gửi tiêu điểm đến chính RV.

  1. Giải pháp duy nhất tôi thấy là người nghe chính để chọn mục để định vị currentPosition + spancount.
Các vấn đề liên quan