是的,Android的ViewHolder模式可以處理多種視圖類型。為了實現這個功能,你需要在Adapter中的getItemViewType()
方法中根據不同的視圖類型創建不同的ViewHolder。然后,在onBindViewHolder()
方法中,根據傳入的視圖類型綁定相應的數據。
以下是一個簡單的示例:
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<Object> dataList; // 數據源,可以是多種類型的數據
public MyAdapter(List<Object> dataList) {
this.dataList = dataList;
}
@Override
public int getItemViewType(int position) {
// 根據position返回不同的視圖類型
if (dataList.get(position) instanceof String) {
return 0;
} else if (dataList.get(position) instanceof Integer) {
return 1;
} else {
return 2;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 根據視圖類型創建不同的ViewHolder
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
if (viewType == 0) {
View view = inflater.inflate(R.layout.item_string, parent, false);
return new StringViewHolder(view);
} else if (viewType == 1) {
View view = inflater.inflate(R.layout.item_integer, parent, false);
return new IntegerViewHolder(view);
} else {
View view = inflater.inflate(R.layout.item_other, parent, false);
return new OtherViewHolder(view);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// 根據視圖類型綁定相應的數據
Object item = dataList.get(position);
if (holder instanceof StringViewHolder) {
((StringViewHolder) holder).textView.setText((String) item);
} else if (holder instanceof IntegerViewHolder) {
((IntegerViewHolder) holder).textView.setText(String.valueOf((Integer) item));
} else {
((OtherViewHolder) holder).textView.setText(item.toString());
}
}
@Override
public int getItemCount() {
return dataList.size();
}
// 定義不同的ViewHolder類
static class StringViewHolder extends RecyclerView.ViewHolder {
TextView textView;
StringViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text_view);
}
}
static class IntegerViewHolder extends RecyclerView.ViewHolder {
TextView textView;
IntegerViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text_view);
}
}
static class OtherViewHolder extends RecyclerView.ViewHolder {
TextView textView;
OtherViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text_view);
}
}
}
這個示例中,我們定義了一個MyAdapter
類,它繼承自RecyclerView.Adapter
。在getItemViewType()
方法中,我們根據數據源中的不同類型返回不同的視圖類型。然后,在onCreateViewHolder()
方法中,我們根據視圖類型創建不同的ViewHolder。最后,在onBindViewHolder()
方法中,我們根據視圖類型綁定相應的數據。