2015-03-12 22 views
7

gì nếu tôi có 50 loại quan điểm? Tôi có nên có 50 lớp bên trong tĩnh trong bộ điều hợp của mình không? Theo số this answer, có.Làm thế nào để xử lý rất nhiều loại chế độ xem khác nhau trong recyclerview viewholder

Suy nghĩ đầu tiên của tôi là để di chuyển mỗi lớp bên viewholder thành một public class riêng biệt, nhưng họ phải được tĩnh. Vì vậy, đóng gói mỗi một thành một lớp học công cộng, để làm cho lớp bên trong tĩnh? Có bất kỳ lựa chọn thay thế đẹp hơn?

chỉnh sửa: mẫu mã: Vì vậy, đây sẽ là một giải pháp tốt? Điều này cũng không giết hiệu suất?

public class MainViewHolder extends DragSortAdapter.ViewHolder implements View.OnClickListener, View.OnLongClickListener { 
View container; 
TextView title; 

//called in onCreateViewHolder in adapter 
public MainViewHolder(DragSortAdapter adapter, View itemView) { 
    super(adapter, itemView); 

    container = itemView.findViewById(R.id.card_root); 

    title = container.findViewById(R.id.text); 
} 
//called by onBindViewHolder in adapter 
public void setData(Data data) { 
    title.setText(data.title); 
} 
} 

edit2: mẫu, khi một trường hợp mới được trả về của viewholder

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     case 0: return new MainViewHolder(...); 
     case 2: return new MainViewHolderOther(...); 
     ... 
    } 
} 
+0

Tại sao bạn nghĩ một lớp cấp cao nhất không phải là tĩnh? Bạn có thể thêm một số ví dụ mã để làm rõ ý của bạn không? – nhaarman

+0

tại sao chúng phải tĩnh? – Blackbelt

+0

@NiekHaarman lớp công khai cấp cao nhất không thể tĩnh trong java. – Tamas

Trả lời

8

Bạn có thể chỉ sử dụng một viewHolder lớp bên trong để xử lý nhiều viewType khác nhau. Trước hết bạn phải sử dụng getItemViewType (viewType) để có được vị trí mục và cũng phải sử dụng viewHolder theo viewType Chức.

Hãy Một lớp bên vieHolder trong đó bạn có thể vượt qua cái nhìn và viewtype theo vị trí của mặt hàng và thổi phồng cách bố trí như hình dưới đây mã. Mẫu mã được đưa ra dưới đây.

public class Adapter extends 
     RecyclerView.Adapter<Adapter.MyViewholder> { 

LayoutInflater inflater; 
private Context context; 
ArrayList<Detail> data = new ArrayList<Detail>(); 

public Adapter(Context context, ArrayList<Detail> getdata) { 
    this.context = context; 
    inflater = LayoutInflater.from(context); 
    this.data = getdata; 
} 

class MyViewholder extends RecyclerView.ViewHolder { 
    TextView txtRow, txt_rec; 

    public MyViewholder(View view, int type) { 
     super(view); 

     if (type == Constants.NORMAL) { 
      txtRow = (TextView) view 
        .findViewById(R.id.txtRow); 
     } else if (type == Constants.RECORDING) { 
      txt_rec = (TextView) view 
        .findViewById(R.id.txt_rec); 
     } 
    } 
} 

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

@Override 
public void onBindViewHolder(MyViewholder viewholder, int position) { 
    int listViewItemType = getItemViewType(position); 
    Detail detail = data.get(listViewItemType); 
    if (detail.getType() == Constants.NORMAL) { 
     viewholder.txtRow.setText(detail.getKey()); 
    } else if (detail.getType() == Constants.RECORDING) { 
     viewholder.txt_rec.setText(detail.getRecording()); 
    } 

} 

@Override 
public MyViewholder onCreateViewHolder(ViewGroup parent, int viewType) { 

    int listViewItemType = getItemViewType(viewType); 
    switch (listViewItemType) { 
     case 0: 
       view = inflater.inflate(R.layout.detail_item, parent, 
        false); 
      myViewholder = new MyViewholder(view, Constants.NORMAL); 
     case 2: 
      view = inflater.inflate(R.layout.recording, parent, false); 
      myViewholder = new MyViewholder(view, Constants.RECORDING); 
    } 
    return myViewholder; 
} 

@Override 
public int getItemViewType(int position) { 
     return position; 
    } 
} 

Hope mã này sẽ giúp bạn

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