FirebaseRecyclerAdapter и умножение типов элементов на Android
Я хочу добавить 2 типа:-
- с изображением
- без изображения
в моем recyclerview
, Я знаю, что мне нужно переопределить метод из FirebaseRecyclerAdapter
но я не знаю как. Помогите мне пожалуйста с этим.
@Override
public int getItemViewType(int position) {
return mModelLayout;
}
abstract protected void populateViewHolder(VH viewHolder, T model, int position);
Поэтому я хочу получить тип элемента T-модели через int (1 - с изображением, 2 - без) и изменить mModelLayout, основываясь на этой информации. Могу ли я просто добавить, если еще заявление там?
3 ответа
Этот ответ основан на ответе хатбойсама. Мне понадобились целые годы, чтобы понять, как все сочетается друг с другом, поэтому я решил подробно описать решение здесь:
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 () и setText() - это методы, которые вы должны написать в "открытом статическом классе. ChatHolder extends RecyclerView.ViewHolder"
// Вот класс ViewHolder для хорошей меры
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);
}
}
Вы должны переопределить getItemViewType
метод, чтобы вернуть идентификатор ресурса для макета, который вы хотите загрузить. Как это:
@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;
}
}
Это приведет к onCreateViewHolder
раздувать правильный макет для каждого элемента. Ваш класс ViewHolder должен быть в состоянии обрабатывать оба типа элементов. Затем в populateViewHolder
Вы можете заполнить соответствующие представления на основе позиции элемента.
Попробуйте сделать это Override.
mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(options) {
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
Я нашел ответ на этом сайте.
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);
}
};