2015-12-24 24 views
14

Tôi cần thêm một dải nhỏ ở giữa các mục của RecyclerView. Dải này có thể đến sau số lượng mục khác nhau trong một danh sách. Điều này cần phải được thực hiện tự động. Tôi cần phải thực hiện một cái gì đó giống như những gì FitBit đã thực hiện: enter image description hereLàm cách nào để thêm chế độ xem động ở giữa các mục của RecyclerView trong Android?

Tôi cũng cần hàng đầu tiên có nghĩa là "Tuần này" để ở trên đầu ngay cả khi trang cuộn xuống.

+3

Bạn phải sử dụng hai loại chế độ xem. Xem [câu hỏi này] (http: // stackoverflow.com/questions/26245139/how-to-create-recyclerview-với-nhiều-view-type) để xem cách triển khai nó. Nó có thể là một đầu mối để đạt được những gì bạn muốn. – Fllo

+0

Có, tôi đã thực hiện chỉ sử dụng tính năng đó. Nhưng một vấn đề vẫn còn tồn tại - làm thế nào để FitBit quản lý để giữ cho hàng tiêu đề gắn bó trên đầu màn hình ngay cả khi chúng ta cuộn? – Sid

+4

Bạn có thể thử [thư viện] này (https://github.com/timehop/sticky-headers-recyclerview) Bạn có thể setcustom bố trí cho các mục và tiêu đề vì vậy tôi nghĩ rằng đây là excatly những gì bạn đang tìm kiếm – Cilenco

Trả lời

5

Bạn nên sử dụng khái niệm về các loại chế độ xem khác nhau bằng cách sử dụng getItemViewType(int). Sau đó, trên onCreateViewHolder(ViewGroup, int) bạn có thể kiểm tra loại bạn nên thổi phồng/tạo.

Ví dụ:

@Override 
public int getItemViewType(int position) { 
    // you should return the view type, based on your own dynamic logic 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     // handle each view type accordingly 
    } 
} 
+0

Bạn có thể cung cấp liên kết hoặc ví dụ không? – mrid

0

Bạn có thể sử dụng các khái niệm về nhiều loại chế độ xem trong RecyclerView của bạn, Chỉ cần bằng cách sử dụng getItemViewType(), và chăm sóc của tham số viewType trong onCreateViewHolder().

Ví dụ, bạn có thể sử dụng dưới đây mô hình:

public class Data{ 
      int field1; 
      float filed2; 
      int rowType // 1,2,2,...N this will fill by you whenever you will  
         //creating arraylist for your recyclerview 
    } 


    public class Custome Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    ArrayList<Data> mItems; 

    class ViewHolderRowType1 extends RecyclerView.ViewHolder { 
     ... 
    } 

    class ViewHolderRowType2 extends RecyclerView.ViewHolder { 
     ... 
    } 

    .... 
    class ViewHolderRowTypeN extends RecyclerView.ViewHolder { 
     ... 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return mItems.get(position).rowType; 
     //or 
     //return positon%2; // This will based on your condition   
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case 0: return new ViewHolderRowType0(...); 
      case 1: return new ViewHolderRowType1(...); 
      ... 
      case N: return new ViewHolderRowTypeN(...); 
     } 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder vh, int position) { 

    //Just check which view type is going to bind and then fill the data accordingly in your rows 


     if(vh instanceof ViewHolderRowType1){ 
     // Fill the data for first view type 


     } else if (vh instanceof ViewHolderRowType2) { 
     // Fill the data for second view type 


     } else if (vh instanceof ViewHolderRowTypeN){ 
     // Fill the data for Nth view type 


     } 

    } 

Đối dính "quan điểm này yếu" của bạn, bạn có thể thêm nó ở trên cùng của RecyclerView bạn và sau đó xử lý nó bằng cách cuộn tổ chức sự kiện của RecyclerView

0

Có hai cách để thực hiện như vậy RecyclerView

  1. Thêm tiêu đề vào mọi bố cục và ẩn/hiển thị theo yêu cầu của bạn (thích hợp hơn).
  2. Hoặc sử dụng hai bố cục khác nhau cho đầu trang và nội dung (không thích hợp hơn vì nó có thể gây ra sự cố trong tổng số mục trong bộ điều hợp).

Trong lớp POJO/GetterSetter tùy chỉnh của bạn, thêm một trường cho headerStatus (hoặc là boolean hoặc int), để xác định có hiển thị tiêu đề hay không.

Bây giờ trong ghi đè bộ điều hợp public int getItemViewType(int position).

static final int TYPE_ITEM = 0; 
 
static final int TYPE_SEPARATOR = 1; 
 
@Override 
 
public int getItemViewType(int position) { 
 
\t if (mData.get(position).getHeaderStatus() == 0) 
 
\t \t return TYPE_ITEM; 
 
\t else 
 
\t \t return TYPE_SEPARATOR; 
 
}

Bây giờ tại thời điểm lạm phát cách bố trí trong getView() bạn có thể kiểm tra các loại hàng bởi

int rowType = getItemViewType(position);

Đối với trường hợp 1, bạn cần phải nhìn thấy tiêu đề và đặt dữ liệu thích hợp trong đó. Đối với trường hợp 2, bạn cần thổi phồng bố cục tiêu đề đó và thêm dữ liệu thích hợp vào đó.

0

Nếu bạn muốn làm điều đó theo cách "đúng đắn", mà không hacks, bạn nên viết LayoutManager của riêng bạn, và xử lý những trường hợp này bằng tay. Nó không phải là khó như nó âm thanh, nhưng sẽ mất một số nỗ lực.

+0

bạn có thể cung cấp bất kỳ ví dụ nào về layoutManager không? –

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