6

Tôi đang phát triển một ứng dụng Android trong đó tôi đang lưu trữ hai loại thông tin khác nhau trên 'FirebaseDatabase`.Làm cách nào để đặt hai bộ điều hợp cho một RecyclerView?

Sau đó, trong MainActivity, tôi sẽ truy xuất chúng và hiển thị cho người dùng trong một RecyclerView. Cả hai thông tin có nghĩa là được hiển thị trong các bố cục khác nhau, tức là bố cục cho cả hai bố cục khác nhau và đó là lý do tại sao tôi tạo hai lớp Mô hình khác nhau và hiện có 2 bộ điều hợp khác nhau. Tôi đang sử dụng FastAdapter bởi @MikePenz

Vì vậy, những gì tôi đã làm là tôi đặt bộ chuyển đổi trên recyclerview trong chuỗi giống như thông tin được lấy từ cơ sở dữ liệu:

1.

public void prepareDataOfSRequests() { 
     gModelClass = new GModelClass(postedBy, ***, ***, ***, "error", ***, formattedTime, currentLatitude, currentLongitude, utcFormatDateTime, userEmail, userID, null, ***, itemID); 
     fastItemAdapter.add(0, gModelClass); 
     recyclerView.setAdapter(fastItemAdapter); 
     recyclerView.smoothScrollToPosition(0); 
     emptyRVtext.setVisibility(View.INVISIBLE); 
    } 

2 .

public void prepareDataOfERequests() { 
     eModelClass = new EModelClass(***, ***, ***, ***, "error", ***, formattedTimeE, currentLatitudeE, currentLongitudeE, utcFormatDateTimeE, userEmailE, userIDE, null, ***, ***, ***, ***, itemID); 
     fastItemAdapterER.add(eventRequestsModelClass); 
     recyclerView.setAdapter(fastItemAdapterER); 
     recyclerView.smoothScrollToPosition(0); 
     emptyRVtext.setVisibility(View.INVISIBLE); 
    } 

vì recyclerview chỉ là một và tôi thiết lập 2 bộ điều hợp khác nhau từng cái một, recyclerview được cập nhật với bộ điều hợp thứ 2 và chỉ hiển thị Nội dung của nó.

Vì vậy, làm cách nào tôi có thể hiển thị hoặc đặt cả bộ điều hợp cho cùng một 'RecyclerView' và có thể hiển thị nội dung được lưu trữ trong cả bộ điều hợp.

+0

bạn có thể làm hai loại viewholder và yêu cầu một giao diện ... nếu mục là instanceof Class1 vẽ viewholder1 khác viewholder2 – JCDecary

+0

@ JCDecary nhưng tôi phải cho cả hai người xem trong recyclerview. Tôi nghĩ rằng mã của bạn sẽ hiển thị một trong hai. Đúng? –

+0

không có bạn sẽ có cả hai bạn juste có để ghi đè lên getitemcount – JCDecary

Trả lời

11

Bạn không thể đặt hai bộ điều hợp trên một RecyclerView. Tuy nhiên, bạn có thể tạo Bộ điều hợp tùy chỉnh xử lý hai loại mục. Dưới đây là cách thực hiện:

Giả sử bạn cần hiển thị các đối tượng của hai loại A số thập phân và B chu kỳ. Hãy xử lý kịch bản khó nhất, đó là, các đối tượng của bạn yêu cầu bố trí hoàn toàn khác nhau để hiển thị chúng và hoàn toàn khác nhau ViewHolders. Sau đây là các ViewHolders:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    ... 
    private static class AnimalViewHolder extends RecyclerView.ViewHolder { 
     public AnimalViewHolder(View itemView) { 
      super(itemView); 

      // prepare your ViewHolder 
     } 

     public void bind(Animal animal) { 
      // display your object 
     } 
    } 

    private static class BeverageViewHolder extends RecyclerView.ViewHolder { 
     // like the one above 
     ... 
    } 
} 

Trước tiên, bạn thêm hằng số để adapter của bạn đại diện cho loại chế độ xem của bạn:

private static final int ITEM_TYPE_ANIMAL; 
private static final int ITEM_TYPE_BEVERAGE; 

Vì lợi ích của sự đơn giản cho phép giả sử bạn lưu trữ đối tượng của bạn trong một danh sách:

private List<Object> items = new ArrayList<>(); 

public MyAdapter(List<Object> items) { 
    this.items.addAll(items); 
    ... 
} 

Trước tiên, bạn cần triển khai getItemViewType:

@Override 
public int getItemViewType(int position) { 
    if (items.get(position) instanceof Animal) { 
     return ITEM_TYPE_ANIMAL; 
    } else { 
     return ITEM_TYPE_BEVERAGE; 
    } 
} 

Tiếp theo, bạn sử dụng các loại sản phẩm bên trong onCreateViewHolder:

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); 

    if (viewType == ITEM_TYPE_ANIMAL) { 
     layoutInflater.inflate(R.layout.item_animal, parent, false); 

     return new AnimalViewHolder(view); 
    } else {  
     layoutInflater.inflate(R.layout.item_beverage, parent, false); 

     return new BeverageViewHolder(view); 
    } 
} 

Cuối cùng, bạn gắn giữ quan điểm đúng đắn:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
    Object item = items.get(position); 

    if (viewHolder instanceof AnimalViewHolder) { 
     ((AnimalViewHolder) viewHolder).bind((Animal) item); 
    } else { 
     ((BeverageViewHolder) viewHolder).bind((Beverage) item); 
    } 
} 
+0

Bạn chỉ có thể trả về id tài nguyên bố cục bên trong 'getItemViewType'. Và sau đó trong 'onCreateViewHolder' chỉ cần tăng' viewType' trong tham số phương thức. –

+0

Bạn có thể, nhưng mẹo này chỉ đạt được tiềm năng đầy đủ của nó nếu bạn đang sử dụng cùng một ViewHolder cho cả hai bố cục. Nếu không, bạn ở lại với if-elses trong tạo và ràng buộc và đạt được là tối thiểu. –

0

Nếu bạn thích, bạn chắc chắn có thể viết một lớp trung lưu để chấp nhận nhiều adapter.

Bạn có thể có một cái nhìn vào những gì bạn làm gì nếu bạn quan tâm đến. https://github.com/Jintin/MixAdapter

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