Reputation: 2093
I currently have a list of items in my recyclerView. However, I want to insert a different type of viewHolder at a random position.
I have a layout file my_other_view which I want to insert at a random position in the recyclerview. The layout file has to be associated with a ViewHolder as well.
This is my current RecyclerAdapter class
public class MyAdapter extends RecyclerView.Adapter
{
private List<MyItem> items;
private Context context;
public MyAdapter (Context context, List<MyItem> items)
{
this.items = items;
this.context = context;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
holder.itemView.setLongClickable(true);
((MyViewHolder) holder).bindData(items.get(position));
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public int getItemViewType(final int position) {
return R.layout.my_list_entry;
}
}
Upvotes: 1
Views: 91
Reputation: 1111
For consistency create the random index as part of your constructor and store it in a local variable. Then do something like this
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_1 = 1;
private static final int TYPE_2 = 2;
int randomPos = 0;
public MyAdapter (Context context, List<MyItem> items){
this.items = items;
this.context = context;
randomPos = new Random().nextInt(items.size());
}
@Override
public int getItemViewType(int position) {
return position == randomPos ? TYPE_2 : TYPE_1;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case TYPE_1: return new ViewHolder1(...);
case TYPE_2: return new ViewHolder2(...);
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
switch (holder.getItemViewType()) {
case TYPE_1:
ViewHolder1 viewHolder1 = (ViewHolder1)holder;
...
break;
case TYPE_2:
ViewHolder2 viewHolder2 = (ViewHolder2)holder;
...
break;
}
}
class ViewHolder1 extends RecyclerView.ViewHolder {
...
public ViewHolder1(View itemView){
...
}
}
class ViewHolder2 extends RecyclerView.ViewHolder {
...
public ViewHolder2(View itemView){
...
}
}
Upvotes: 1