Reputation: 71
I want to add 2 types:-
in my recyclerview
. I know that I need to override method from FirebaseRecyclerAdapter
but I don't know how.
Help me please with this.
@Override
public int getItemViewType(int position) {
return mModelLayout;
}
abstract protected void populateViewHolder(VH viewHolder, T model, int position);
So I want to get from T-model type of item via int (1 - with image, 2 - without) and change mModelLayout basing on this info. Can I just add if else statement there ?
Upvotes: 4
Views: 1831
Reputation: 1
Try to make it Override.
mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(options) {
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
Upvotes: 0
Reputation: 737
This answer builds on hatboysam's answer. It took me ages to figure out how everything fits together so I thought I'd describe the solution thoroughly here:
mRecyclerViewAdapter = new FirebaseRecyclerAdapter<DataObjectModel, ViewHolder>(
DataObjectModel.class, R.layout.defaultitem_layout, ViewHolder.class, mDatabaseRef) {
@Override
public void populateViewHolder(ViewHolder viewholder, final DataObjectModel dataobject, int position) {
if (getItemViewType(position) == R.layout.my_image_item){
viewholder.setName(dataobject.getName());
}
else if (getItemViewType(position) == R.layout.my_no_image_item{
viewholder.setText(dataobject.getText());
}
@Override
public int getItemViewType(int position) {
DataObjectModel dataobject = getItem(position);
if (dataobject.getType() != null && dataobject.getType().equals("image")) {
// Layout for an item with an image
return R.layout.my_image_item);
} else if (dataobject.getType() != null && dataobject.getType().equals("noimage")) {
// Layout for an item without an image
return R.layout.my_no_image_item;
}
}
};
//getName() and setText() are methods you have to write in the "public static class ChatHolder extends RecyclerView.ViewHolder" class
// Here's the ViewHolder Class for good measure
public static class ViewHolder extends RecyclerView.ViewHolder {
View mView;
public ViewHolder (View itemView) {
super(itemView);
mView = itemView;
}
public void setName(String name) {
TextView field = (TextView) mView.findViewById(R.id.name_text);
field.setText(name);
}
public void setText(String text) {
TextView field = (TextView) mView.findViewById(R.id.message_text);
field.setText(text);
}
}
Upvotes: 3
Reputation: 25134
You need to override the getItemViewType
method to return the resource ID for the layout you want to load. Like this:
@Override
public int getItemViewType(int position) {
if (hasImage(position)) {
// Layout for an item with an image
return R.layout.my_image_item;
} else {
// Layout for an item without an image
return R.layout.my_no_image_item;
}
}
This will cause onCreateViewHolder
to inflate the correct layout for each item. Your ViewHolder class will need to be able to handle both item types. Then in populateViewHolder
you can populate the appropriate views based on the item position.
Upvotes: 1
Reputation: 71
I found answer on this web-site.
mAdapter = new FirebaseRecyclerAdapter<User, RecyclerView.ViewHolder>(
User.class, R.layout.item_user, RecyclerView.ViewHolder.class, ref) {
@Override
protected void populateViewHolder(final RecyclerView.ViewHolder viewHolder, final User user,
final int position) {
switch (user.getType()) {
case Constants.USER_TYPE_1:
populateType1((ViewHolder1) viewHolder, user, position);
break;
case Constants.USER_TYPE_2:
populateType2((ViewHolder2) viewHolder, user, position);
break;
case Constants.USER_TYPE_3:
populateType3((ViewHolder3) viewHolder, user, position);
break;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case USER_TYPE_1:
View userType1 = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_type1, parent, false);
return new ViewHolder1(userType1);
case USER_TYPE_2:
View userType2 = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_type2, parent, false);
return new ViewHolder2(userType2);
case USER_TYPE_3:
View userType3 = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_type3, parent, false);
return new ViewHolder3(userType3);
}
return super.onCreateViewHolder(parent, viewType);
}
@Override
public int getItemViewType(int position) {
User user = getItem(position);
switch (user.getType()) {
case Constants.USER_TYPE_1:
return USER_TYPE_1;
case Constants.USER_TYPE_2:
return USER_TYPE_2;
case Constants.USER_TYPE_3:
return USER_TYPE_3;
}
return super.getItemViewType(position);
}
};
Upvotes: -1