5

Tôi đã triển khai một recyclerview có thể mở rộng với các phần tử con là một phần của danh sách. Tôi đã theo dõi số code này. Đây là cách hoạt động,Thay đổi trình quản lý bố cục cho các chế độ xem khác nhau trong RecyclerView

Việc triển khai ExpandableListView bằng RecyclerView được mô tả ngắn gọn như sau. Mô hình danh sách có thông số bổ sung "loại" xác định liệu mục đó có phải là một tiêu đề hay một phần tử con hay không. Bằng cách kiểm tra tham số này, bộ điều hợp thổi phồng chế độ xem và trình xem tương ứng với loại. Nếu loại là HEADER, nó sẽ thổi phồng bố cục của mục tiêu đề, có chứa một TextView và một ImageView để chỉ ra liệu cây con có được mở rộng hay không.

Bây giờ, những gì tôi muốn làm là làm cho bố cục được mở rộng thành lưới. Tôi thường làm điều này bằng cách thiết lập trình quản lý bố cục cho GridLayoutManager nhưng trong trường hợp này, tôi chỉ sử dụng một recyclerview, có nghĩa là tôi không thể thay đổi trình quản lý bố cục mà không thay đổi tiêu đề, điều này khiến cho toàn bộ recyclerview biến thành lưới bao gồm các tiêu đề.

Câu hỏi của tôi là: làm cách nào bạn thay đổi trình quản lý bố cục cho chỉ một vài bố cục bên trong bộ điều hợp?

Chỉnh sửa: Tôi đã thêm một số mã.

Recyclerview adapter:

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

// These are constants that are used to determine if the item is a child or a header and is defined with each item from the data model 
public static final int HEADER = 0; 
public static final int CHILD = 1; 

private List<Item> data; 

public ExpandableListAdapter(List<Item> data) { 
    this.data = data; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) { 
    View view = null; 

    LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    // Check whether the item is a header or child and inflate differnet layouts 
    switch (type) { 
     case HEADER: 
      // Inflate a header layout if the item is a header 
      view = inflater.inflate(R.layout.list_header, parent, false); 
      ListHeaderViewHolder header = new ListHeaderViewHolder(view); 
      return header; 
     case CHILD: 
      // Inflate a child layout if the item is a child 
      view = inflater.inflate(R.layout.list_child, parent, false); 
      ListChildViewHolder child = new ListChildViewHolder(view); 
      return child; 
    } 
    return null; 
} 

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    final Item item = data.get(position); 

    // Bind different layouts based on if the item is a header or child 
    switch (item.getType()) { 
     case HEADER: 
      // ... 
     case CHILD: 
      // ... 
    } 
} 

@Override 
public int getItemViewType(int position) { 
    return data.get(position).type; 
} 

@Override 
public int getItemCount() { 
    return data.size(); 
} 

// Viewholder for the header items 
private static class ListHeaderViewHolder extends RecyclerView.ViewHolder { 
    // ... 
} 

// Viewholder for the child items 
private static class ListChildViewHolder extends RecyclerView.ViewHolder { 
    // ... 
} 

Và đây là hoạt động chính nơi tôi tuyên bố người quản lý bố trí:

recyclerview = (RecyclerView) findViewById(R.id.recyclerview); 
recyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); 

Trả lời

9

Bạn có thể thay đổi người quản lý bố trí để GridLayoutManager và xác định các "span size" cho tiêu đề, ví dụ: nếu bạn muốn lưới có 2 cột, tiêu đề phải có kích thước khoảng 2 và kích thước khoảng trẻ em 1:

GridLayoutManager glm = new GridLayoutManager(getContext(), 2); 
    glm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
     @Override 
     public int getSpanSize(int position) { 
      switch(getTypeForPosition(position)) { 
       case HEADER: 
        return 2; 
       default: 
        return 1; 
      } 
     } 
    }); 
    recyclerView.setLayoutManager(glm); 

Có ví dụ đầy đủ về lưới có thể mở rộng có tiêu đề here sử dụng library này.

+0

Được rồi, tôi sẽ xem xét những ví dụ. – spectre10

+0

OK, làm cách nào để triển khai bộ điều hợp có thể chọn với thư viện của bạn? Tôi đã tạo ra một lớp trừu tượng mở rộng RecyclerView.Adapter và tôi đang sử dụng bộ điều hợp thông thường của mình mở rộng lớp trừu tượng này. – spectre10

+0

Xin chào, bạn có thể vui lòng tạo câu hỏi mới để bạn có thể cung cấp thêm chi tiết về những gì bạn đã làm cho đến thời điểm này không? Bạn có thể giải thích tốt hơn ý của bạn bằng bộ điều hợp 'có thể lựa chọn' không? Là nó chỉ để làm nổi bật một mục nhấp? – Gustavo

0

thay đổi người quản lý bố trí để GridLayout manager và xử lý các span size như đã đề cập dưới đây

layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       int type=mAdapter.getItemViewType(position); 
       if (type == "view holder type name") 
        return 2; 
       else 
        return 1; 
      } 
     }); 
Các vấn đề liên quan