2017-01-11 23 views
5

Những gì tôi có ý định để đạt đượcRecyclerView ngang với chiều cao mục biến không gói đúng

enter image description here

Quan điểm mục nên chiếm toàn bộ chiều cao của mặt hàng đó

enter image description here

Nó có thể có thể là chiều cao của mặt hàng nhỏ hơn chiều cao của mặt hàng cao nhất trong recyclerview, trong trường hợp đó nó chỉ cần dính vào đỉnh như trong ảnh chụp màn hình ở trên.

Lỗi Tôi đang chạy vào

enter image description here

Như trong hình trên, quan điểm đang nhận được cắt ngắn.

Những gì tôi đã cố gắng cho đến nay

Ban đầu tôi đã đi với wrap_content trên recyclerview, bây giờ mà nó được hỗ trợ. Nó không hoạt động khi không có lượt xem nào hiển thị trên màn hình lúc đó là cao nhất. Điều này có ý nghĩa trong cách phân cấp khung nhìn. Làm thế nào chiều cao của một cái gì đó thậm chí không bị ràng buộc với bất kỳ dữ liệu nào được tính nếu chiều cao phụ thuộc vào dữ liệu đó?

thời gian Cách giải quyết: S

Thay vì cố gắng một LayoutManager tùy chỉnh, đầu tiên tôi đi với những gì tôi cảm thấy cần phải làm - lắp đặt tất cả quan điểm mục ngay từ đầu để tìm ra chiều cao của họ.

Có một thanh tiến trình và hoạt ảnh đang phát ở phần trên của màn hình để thu hút sự chú ý của người dùng trong khi tất cả điều này xảy ra với khả năng hiển thị recyclerview được đặt thành ẩn. Tôi sử dụng hai thứ, một thứ không đủ - tôi đã đính kèm một người quan sát trong cuộc gọi onViewAttached() của bộ điều hợp và tôi cũng đã sử dụng một trình nghe thay đổi cuộn. Có một LinearSnapHelper được gắn vào khung nhìn của người tái chế để bám vào vị trí liền kề (tiếp theo hoặc trước đó, tùy thuộc vào hướng cuộn) trên cuộn giấy.

Trong thiết lập này,

  1. tôi sẽ cho mỗi vị trí trong recyclerview sử dụng layoutManager.smoothScrollToPosition()
  2. Lấy chiều cao xem con sử dụng

     View currentChildView = binding.nextRv.getChildAt(layoutManager.findFirstCompletelyVisibleItemPosition()); 
         if (currentChildView != null) { 
          currentChildHeight = currentChildView.getHeight(); 
         } 
    

trong người nghe thay đổi cuộn trên RecyclerView.SCROLL_STATE_IDLE hoặc bằng cách chuyển chiều cao cho người quan sát đã xem được đề cập ở trên trong onVie của bộ điều hợp wAttachedToWindow()

@Override 
public void onViewAttachedToWindow(BindingViewHolder holder) { 
    if (mObserver != null) { 
     mObserver.onViewAttached(holder.binding.getRoot().getHeight()); 
    } 
} 
  1. Lưu trữ một maxHeight rằng những thay đổi để tối đa của maxHeight và chiều cao của đứa trẻ mới.

Như được hiển nhiên, điều này thật xấu. Thêm vào đó nó không cho tôi chiều cao của khung nhìn hiện tại - onAttached có nghĩa là nó chỉ gắn liền, không được đo lường và đặt ra. Đây là chế độ xem được tái chế, không phải chế độ xem được liên kết với mục dữ liệu hiện tại. Hiển thị các vấn đề như cắt bớt chế độ xem được minh họa ở trên.


Tôi cũng đã cố gắng chiều cao wrap_content trên quan điểm tái chế và hủy bỏ hiệu lực từ cha mẹ tái chế của cho đến khi tái chế và đứa trẻ trên cuộn đến SCROLL_STATE_IDLE. Không hoạt động.


Tôi không chắc chắn cách bố cục tùy chỉnh có thể trợ giúp tại đây.

Ai đó có thể hướng dẫn tôi đi đúng hướng không?

+0

bạn có thể thêm tệp xml của mình – Redman

+0

Vui lòng tìm nó ở đây (https://gist.github.com/adroitandroid/85e7a66d7f796379649c2d9eab26cf76) –

+0

Recyclerview được đề cập là thẻ có id "next_rv".Trên thực tế cho các giải pháp chi tiết ở trên, ban đầu tôi đã đặt nó để chiều cao match_parent và sau đó thiết lập lại chiều cao cho 'maxHeight' thu được –

Trả lời

1

Bên trong bộ chuyển đổi của bạn, nơi tôi có thể tìm thấy hai thẻ chồng lên và một ở phía dưới

Làm thế nào tôi có thể đã được xác định bố cục của tôi là như thế này:

Cardview1 

    LinearLayout1 --> orientation vertical 

    cardview2 (Top card where text is written) 

    Linearlayout2 (where I can see icons such as like etc)-->orientation horizontal 

Bây giờ ấn định chiều cao của Linearlayout2 bằng cách thiết lập nó để bọc nội dung.

Và chiều cao của cardview2 nên 0dp và thêm trọng lượng = 1

Bây giờ bên cardview2 thêm một TextView1 để matchparent về chiều cao và chiều rộng.

Better bên textview1 thêm ellipsize kết thúc và thêm dòng max

Nếu bạn muốn hiển thị tất cả các dòng cố gắng để tìm autoresizetextview thư viện nó có thể được thành lập ở đây ->AutoResizeTextView

Hy vọng nó giúp.

+0

Cảm ơn bạn đã trả lời. Ellipsize là một giải pháp cho nó, nó không giải quyết được truy vấn của tôi. Tôi biết về autoresizetextview :) nhưng tôi không tìm kiếm kích thước phông chữ biến trên danh sách của tôi. –

3

Tôi không thể chấp nhận câu trả lời @Pradeep Kumar Kushwaha vì một giải pháp, tôi không muốn các kích thước phông chữ khác nhau trong danh sách. Tính thống nhất là một yếu tố quan trọng trong thiết kế. Thứ hai thay thế ông đã không thể làm việc vì với ellipsize tôi sẽ cần phải cung cấp cho một nút "thêm" của một số loại cho người dùng để đọc toàn bộ nội dung và xem văn bản của tôi đã tham gia một hành động nhấp chuột. Đặt nhiều hơn một số nơi khác sẽ không được thiết kế tốt.

Thay đổi thiết kế với sự thỏa hiệp đơn giản của thay đổi kích thước recyclerview khi mục cao nhất, cắt ngắn đi vào tiêu điểm, nó biến thành trường hợp sử dụng đơn giản của notifyItemChanged(). Ngay cả đối với những nỗ lực tôi đã thực hiện bằng cách sử dụng quan sát kèm theo xem và người nghe trạng thái cuộn, notifyItemChanged có thể được sử dụng nhưng cách tiếp cận đó chỉ là quá hacky. Điều này tôi có thể sống với cả mã và thiết kế. Ở đây có mã yêu cầu.

@Override 
public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
    if (newState == RecyclerView.SCROLL_STATE_IDLE) { 
     int position = ((LinearLayoutManager) binding.nextRv.getLayoutManager()) 
       .findFirstVisibleItemPosition(); 
     if (position != nextSnippetAdapter.getItemCount() - 1) { 
      binding.nextRv.getAdapter().notifyItemRangeChanged(position, 2); 
     } else { 
      binding.nextRv.getAdapter().notifyItemChanged(position); 
     } 
    } 
} 

Để thiết lập cụ thể của tôi, chỉ cần gọi hai thành phần này hoạt động. Nó có thể được tối ưu hóa hơn nữa để gọi cho một phần tử duy nhất tại position + 1 trong hầu hết các trường hợp, và kiểm tra và gọi cho một trong những trường hợp thích hợp trong góc (chữ).

+0

Đó là một thỏa hiệp thiết kế vì những thứ trên màn hình sẽ phải di chuyển để đưa toàn bộ mục vào tiêu điểm (sử dụng 'binding.contentScrollView.fullScroll (ScrollView.FOCUS_DOWN);') –

+0

Thực ra nó không phải là một sự thỏa hiệp thiết kế lớn. Nếu tôi không cuộn để cuộn xuống dưới, mọi thứ sẽ ổn. Có thể nhận thấy rằng chế độ xem đã tăng và tràn màn hình để người dùng có thể được mong đợi cuộn để xem toàn bộ nội dung. –

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