2015-04-14 17 views
5

Tôi đang xây dựng một giỏ hàng RecyclerView hiển thị tất cả các mục trong giỏ hàng trong RecyclerView, cũng như nó có một cái nhìn bổ sung ở phía dưới tóm tắt giỏ hàng (tổng số nợ, chiết khấu phiếu giảm giá nếu có, vv).Có thể có mục cuối cùng trong RecyclerView để được gắn xuống dưới cùng nếu không cần cuộn?

Nếu có> 3 mục trong giỏ hàng, có vẻ như người dùng sẽ phải cuộn xuống cuối để xem "chế độ xem tóm tắt". Tuy nhiên, nếu có 1 hoặc 2 mục, các mục đầu tiên sẽ xuất hiện, so với chế độ xem tóm tắt, sau đó là khoảng trắng. Tôi muốn các mục đầu tiên, sau đó khoảng trắng, sau đó là chế độ xem tóm tắt.

Tôi đã thử thêm các mục trống, tuy nhiên, tùy thuộc vào độ phân giải của thiết bị, có vẻ không nhất quán.

xuất hiện hiện tại nếu ít hơn 3 mục (ví dụ: nếu không yêu cầu cuộn):

----------- 
| Item1 | 
| ------- | 
| Item2 | 
| ------- | 
| Summary | 
| ------- | 
|   | 
|   | 
|   | 
|   | 
---------- 

xuất hiện mong muốn:

----------- 
| Item1 | 
| ------- | 
| Item2 | 
| ------- | 
|   | 
|   | 
|   | 
|   | 
| ------- | 
| Summary | 
---------- 
+0

Có thể, cuối cùng bạn có thể triển khai trình quản lý bố cục tuyến tính theo cách đó. Nhưng tôi thà xem xét một cách khác: đặt bản tóm tắt của bạn vào một chế độ xem riêng biệt bên dưới chế độ xem của người tái chế. Khi chế độ xem của trình thu thập yêu cầu cuộn, bạn thêm một mục tóm tắt mới vào phần dưới cùng của nó, đồng thời làm hoạt hình chế độ xem bổ sung này trượt xuống và biến mất chẳng hạn. – AndroidEx

Trả lời

2

Tôi đã suy nghĩ về nhiệm vụ của bạn và cuối cùng đặt cùng một số mã mà bạn có thể thấy hữu ích. Có một vấn đề trên giai đoạn này mặc dù.

Những gì tôi đã được thêm vào một nhà thiết item đến một cái nhìn tái chế:

recyclerView.addItemDecoration(new StickySummaryDecoration()); 

Và đây là thực hiện của tôi về trang trí cơ bản (thẳng thắn, đó là kinh nghiệm đầu tiên của tôi với trang trí mục, vì vậy nó có thể không được tối ưu hay hoàn toàn chính xác nhưng tôi đã làm hết sức mình):

public class StickySummaryDecoration extends RecyclerView.ItemDecoration { 

    @Override 
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { 
     int childCount = parent.getAdapter().getItemCount(); 
     int lastVisibleItemPosition = 
       ((LinearLayoutManager) parent.getLayoutManager()).findLastVisibleItemPosition(); 
     int firstVisiblePosition = 
       ((LinearLayoutManager) parent.getLayoutManager()) 
         .findFirstCompletelyVisibleItemPosition(); 
     if ((firstVisiblePosition == 0) && (lastVisibleItemPosition == (childCount - 1))) { 
      View summaryView = parent.getChildAt(parent.getChildCount() - 1); 
      int topOffset = parent.getHeight() - summaryView.getHeight(); 
      int leftOffset = 
        ((RecyclerView.LayoutParams) summaryView.getLayoutParams()).leftMargin; 
      c.save(); 
      c.translate(leftOffset, topOffset); 
      summaryView.draw(c); 
      c.restore(); 
      summaryView.setVisibility(View.GONE); 
     } 
    } 
} 

Vì vậy, những gì tôi nhận được với điều này.

Bottom-cập cảng tóm tắt trong danh sách ngắn:

Short list

Bạn cần phải cuộn xuống để xem tóm tắt trong danh sách dài:

Long list (you need to scroll down to see the summary element)

Bây giờ về một vấn đề. Tác dụng phụ này khi cuộn lùi trong danh sách dài là những gì tôi chưa giải quyết.

problem

thí nghiệm của tôi được tải lên một github repo chỉ trong trường hợp :)

EDIT

Chỉ cần bây giờ tôi đến với tôi rằng phần tử hàng còn thiếu trong giao diện tái chế là tái chế của tôi người xem chế độ xem tóm tắt có độ hiển thị GONE. Nên có một cách để đưa nó trở lại ...

EDIT 2

tôi xem xét lại giải pháp đầu tiên của tôi và thay đổi mã một chút để giải thích cho trường hợp danh sách dài (trong trường hợp trang trí mục mà bị tắt (tôi nghĩ nó gần với những gì bạn muốn đạt được)), điều này tự động giải quyết vấn đề hàng bị thiếu.

2

Đây không phải là một trường hợp mục đích sử dụng nhưng bạn tạo một ItemDecorator và khi getItemOffsets được gọi trên khung nhìn dưới cùng, tính toán không gian phía trên nó và đặt nó làm decorOffsetTop.

Mỗi khi bạn thêm một mục, bạn nên vô hiệu hóa bù trừ trang trí mục sao cho RecyclerView sẽ gọi lại cuộc gọi lại của bạn để tính toán mới.

Nó sẽ không tầm thường nhưng điều này sẽ hoạt động.

3

Dựa trên the answer by yigit Tôi đã tạo triển khai hoạt động. Mở rộng ItemDecoration và ghi đè getItemOffsets():

@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    int childCount = parent.getAdapter().getItemCount(); 
    if (parent.getChildLayoutPosition(view) != childCount - 1) return; 
    int lastViewBottom = calculateViewBottom(parent.getLayoutManager().findViewByPosition(childCount - 2)); 

    view.measure(parent.getWidth(), parent.getHeight()); 
    int height = view.getMeasuredHeight(); 
    int topOffset = parent.getHeight() - lastViewBottom - height; 
    if (topOffset < 0) topOffset = itemOffset; 

    outRect.set(itemOffset, topOffset, itemOffset, itemOffset); 
} 

private int calculateViewBottom(View view) { 
    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); 
    return (int) view.getY() + view.getHeight() + params.topMargin + params.bottomMargin; 
} 
+0

ItemOffset được định nghĩa ở đâu? – Remco

+0

Nó không có trong ví dụ, bạn có thể tự xác định nó cho phù hợp với nhu cầu của bạn – Lamorak

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