JavaScript
Sure, here is an example of creating a RecyclerView with different types of views in Java:
First, create a model class to represent the data for each item in the RecyclerView:
public class ListItem {
public static final int TYPE_HEADER = 0;
public static final int TYPE_ITEM = 1;
private int type;
private String title;
public ListItem(int type, String title) {
this.type = type;
this.title = title;
}
public int getType() {
return type;
}
public String getTitle() {
return title;
}
}
Next, create the ViewHolder classes for each type of view:
public class HeaderViewHolder extends RecyclerView.ViewHolder {
private TextView titleTextView;
public HeaderViewHolder(View itemView) {
super(itemView);
titleTextView = itemView.findViewById(R.id.header_title);
}
public void bindData(ListItem item) {
titleTextView.setText(item.getTitle());
}
}
public class ItemViewHolder extends RecyclerView.ViewHolder {
private TextView titleTextView;
public ItemViewHolder(View itemView) {
super(itemView);
titleTextView = itemView.findViewById(R.id.item_title);
}
public void bindData(ListItem item) {
titleTextView.setText(item.getTitle());
}
}
Then, create the RecyclerView adapter:
public class MyAdapter extends RecyclerView.Adapter {
private List items;
public MyAdapter(List items) {
this.items = items;
}
@Override
public int getItemViewType(int position) {
return items.get(position).getType();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (viewType) {
case ListItem.TYPE_HEADER:
View headerView = inflater.inflate(R.layout.header_layout, parent, false);
return new HeaderViewHolder(headerView);
case ListItem.TYPE_ITEM:
View itemView = inflater.inflate(R.layout.item_layout, parent, false);
return new ItemViewHolder(itemView);
default:
throw new IllegalArgumentException("Invalid view type");
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ListItem item = items.get(position);
switch (item.getType()) {
case ListItem.TYPE_HEADER:
((HeaderViewHolder) holder).bindData(item);
break;
case ListItem.TYPE_ITEM:
((ItemViewHolder) holder).bindData(item);
break;
}
}
@Override
public int getItemCount() {
return items.size();
}
}
Finally, use the adapter in your activity or fragment:
public class MyActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recycler_view);
List items = new ArrayList<>();
items.add(new ListItem(ListItem.TYPE_HEADER, "Header 1"));
items.add(new ListItem(ListItem.TYPE_ITEM, "Item 1"));
items.add(new ListItem(ListItem.TYPE_ITEM, "Item 2"));
items.add(new ListItem(ListItem.TYPE_HEADER, "Header 2"));
items.add(new ListItem(ListItem.TYPE_ITEM, "Item 3"));
adapter = new MyAdapter(items);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
}
}
Note that in this example, we have two types of views: headers and items.
The getItemViewType
method in the adapter determines which type
of view to inflate, and the onBindViewHolder
method binds the
data to the appropriate view holder based on the item type