在 recyclerview 中显示值(基于布尔值)returns 所有项目的结果相同
Displaying values in recyclerview (based on boolean value) returns same result for all items
我有一个包含很多物品的回收站视图。我使用适配器从服务器填充 recyclerview,即名称、日期、时间等,它工作正常。
我遇到的唯一问题是当我尝试根据布尔值填充它时。当我尝试添加 image star(用于收藏夹选项)时,当我尝试设置 is closed 文本(对于活动选项),我总是得到带有 "favourite icon" 和 "is closed" 消息的所有项目。
例如,当工作时间返回 active 为 false 时,我正在尝试做的是这样的:
if (!restaurant.getActive()) {
holder.isClosed.setVisibility(View.VISIBLE);
}
当我从 RestaurantDescriptionActivity 设置布尔值时,它工作得很好,它会在服务器上保存和更新它应该的,它也是 returns 正确的值,所以我不确定我的错误在哪里。
我在 RestaurantModel 中像这样返回布尔值:
@SerializedName("favourites")
private boolean isFavourite;
@SerializedName("active")
private boolean active;
----
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(thumbnailUrl);
parcel.writeString(dateTime);
parcel.writeString(id);
parcel.writeValue(comments_enabled);
// I TRIED WRITING BOOLEAN TO PARCEL IN TWO WAYS, AS SHOWN BELOW
parcel.writeValue(isFavourite);
parcel.writeInt(active ? 1 : 0);
}
//// UPDATED PART
protected restaurant(Parcel in) {
...
isFavourite = (Boolean) in.readValue(Boolean.class.getClassLoader());
active = Boolean.parseBoolean(in.readString());
}
//// UPDATED PART
public boolean getActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
适配器:
class restaurantsViewHolder extends RecyclerView.ViewHolder {
public TextView restaurantName, date, time, isClosed;
ImageView thumbNail, isFavourite;
restaurantsViewHolder(View itemView) {
super(itemView);
thumbNail = itemView.findViewById(R.id.thumbnail);
isFavourite = itemView.findViewById(R.id.imageViewIsFavourite);
restaurantName= itemView.findViewById(R.id.restaurantNameIcon);
date = itemView.findViewById(R.id.date);
time = itemView.findViewById(R.id.time);
isClosed= itemView.findViewById(R.id.restaurantIsClosed);
}
}
public restaurantsAdapter(List<restaurant> restaurantList, Context context) {
this.restaurantItems = restaurantList;
this.context = context;
}
@Override
public restaurantsAdapter.restaurantsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row_restaurant, parent, false);
return new restaurantsViewHolder(itemView);
}
@Override
public void onBindViewHolder(restaurantsAdapter.restaurantsViewHolder holder, int position) {
// getting restaurant data for the row
restaurant restaurant = restaurantItems.get(position);
holder.restaurantName.setText(restaurant.getrestaurantName());
LocalDateTime ldt = LocalDateTime.parse(restaurant.getDateTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
String formattedDate = ldt.format(getLocalizedDateFormatter(Locale.getDefault()));
holder.date.setText(formattedDate);
//holder.date.setText(convertDate(restaurant.getDateTime())); //string dobiti u formatu, pretvoriti ga u localized i podijeliti na dva dijela
holder.time.setText(convertTime(restaurant.getDateTime()));
holder.isFavourite.clearColorFilter();
if (!restaurant.getActive()) {
holder.isClosed.setVisibility(View.GONE);
}
if (restaurant.getIsFavourite()) {
holder.isFavourite.setImageResource(R.drawable.ic_icon_star_ppdcolor);
}
}
您需要在 RecyclerView 项目中编写 else 部分,否则它将重新填充其先前的视图状态。
if (!restaurant.getActive()) {
holder.isClosed.setVisibility(View.GONE);
} else{
holder.isClosed.setVisibility(View.VISIBLE);
}
if (restaurant.getIsFavourite()) {
holder.isFavourite.setImageResource(R.drawable.ic_icon_star_ppdcolor);
} else{
holder.isFavourite.setImageResource(R.drawable.your_icon_when_not_favourite);
}
为最喜欢的点击事件制作接口,并在下面代码中使用的主要 activity 中将该记录值设置为 true ...
onItemClickListner onItemClickListner;
public interface onItemClickListner{
void onItemClick(restaurant restaurantobj); // you can pass or object or value to need to access in recycler view activity.
}
public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
this.onItemClickListner = onItemClickListner;
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
if (!restaurant.getActive()) {
holder.isClosed.setVisibility(View.GONE);
} else{
holder.isClosed.setVisibility(View.VISIBLE);
}
if (restaurant.getIsFavourite()) {
holder.isFavourite.setImageResource(R.drawable.ic_icon_star_ppdcolor);
} else{
holder.isFavourite.setImageResource(R.drawable.your_icon_when_not_favourite);
}
holder.isFavourite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListner.onItemClick(restaurant);
}
});
}
以及在您在使用以下代码的 mainactivity 中定义适配器对象之后...
adpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
@Override
public void onItemClick(restaurant restaurantobj) {
restaurantobj.setActive(true);
restaurantList.add(restaurantobj);
adpater.notifyDataSetChanged();
}
});
我有一个包含很多物品的回收站视图。我使用适配器从服务器填充 recyclerview,即名称、日期、时间等,它工作正常。
我遇到的唯一问题是当我尝试根据布尔值填充它时。当我尝试添加 image star(用于收藏夹选项)时,当我尝试设置 is closed 文本(对于活动选项),我总是得到带有 "favourite icon" 和 "is closed" 消息的所有项目。
例如,当工作时间返回 active 为 false 时,我正在尝试做的是这样的:
if (!restaurant.getActive()) {
holder.isClosed.setVisibility(View.VISIBLE);
}
当我从 RestaurantDescriptionActivity 设置布尔值时,它工作得很好,它会在服务器上保存和更新它应该的,它也是 returns 正确的值,所以我不确定我的错误在哪里。
我在 RestaurantModel 中像这样返回布尔值:
@SerializedName("favourites")
private boolean isFavourite;
@SerializedName("active")
private boolean active;
----
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(thumbnailUrl);
parcel.writeString(dateTime);
parcel.writeString(id);
parcel.writeValue(comments_enabled);
// I TRIED WRITING BOOLEAN TO PARCEL IN TWO WAYS, AS SHOWN BELOW
parcel.writeValue(isFavourite);
parcel.writeInt(active ? 1 : 0);
}
//// UPDATED PART
protected restaurant(Parcel in) {
...
isFavourite = (Boolean) in.readValue(Boolean.class.getClassLoader());
active = Boolean.parseBoolean(in.readString());
}
//// UPDATED PART
public boolean getActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
适配器:
class restaurantsViewHolder extends RecyclerView.ViewHolder {
public TextView restaurantName, date, time, isClosed;
ImageView thumbNail, isFavourite;
restaurantsViewHolder(View itemView) {
super(itemView);
thumbNail = itemView.findViewById(R.id.thumbnail);
isFavourite = itemView.findViewById(R.id.imageViewIsFavourite);
restaurantName= itemView.findViewById(R.id.restaurantNameIcon);
date = itemView.findViewById(R.id.date);
time = itemView.findViewById(R.id.time);
isClosed= itemView.findViewById(R.id.restaurantIsClosed);
}
}
public restaurantsAdapter(List<restaurant> restaurantList, Context context) {
this.restaurantItems = restaurantList;
this.context = context;
}
@Override
public restaurantsAdapter.restaurantsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row_restaurant, parent, false);
return new restaurantsViewHolder(itemView);
}
@Override
public void onBindViewHolder(restaurantsAdapter.restaurantsViewHolder holder, int position) {
// getting restaurant data for the row
restaurant restaurant = restaurantItems.get(position);
holder.restaurantName.setText(restaurant.getrestaurantName());
LocalDateTime ldt = LocalDateTime.parse(restaurant.getDateTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
String formattedDate = ldt.format(getLocalizedDateFormatter(Locale.getDefault()));
holder.date.setText(formattedDate);
//holder.date.setText(convertDate(restaurant.getDateTime())); //string dobiti u formatu, pretvoriti ga u localized i podijeliti na dva dijela
holder.time.setText(convertTime(restaurant.getDateTime()));
holder.isFavourite.clearColorFilter();
if (!restaurant.getActive()) {
holder.isClosed.setVisibility(View.GONE);
}
if (restaurant.getIsFavourite()) {
holder.isFavourite.setImageResource(R.drawable.ic_icon_star_ppdcolor);
}
}
您需要在 RecyclerView 项目中编写 else 部分,否则它将重新填充其先前的视图状态。
if (!restaurant.getActive()) {
holder.isClosed.setVisibility(View.GONE);
} else{
holder.isClosed.setVisibility(View.VISIBLE);
}
if (restaurant.getIsFavourite()) {
holder.isFavourite.setImageResource(R.drawable.ic_icon_star_ppdcolor);
} else{
holder.isFavourite.setImageResource(R.drawable.your_icon_when_not_favourite);
}
为最喜欢的点击事件制作接口,并在下面代码中使用的主要 activity 中将该记录值设置为 true ...
onItemClickListner onItemClickListner;
public interface onItemClickListner{
void onItemClick(restaurant restaurantobj); // you can pass or object or value to need to access in recycler view activity.
}
public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
this.onItemClickListner = onItemClickListner;
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
if (!restaurant.getActive()) {
holder.isClosed.setVisibility(View.GONE);
} else{
holder.isClosed.setVisibility(View.VISIBLE);
}
if (restaurant.getIsFavourite()) {
holder.isFavourite.setImageResource(R.drawable.ic_icon_star_ppdcolor);
} else{
holder.isFavourite.setImageResource(R.drawable.your_icon_when_not_favourite);
}
holder.isFavourite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListner.onItemClick(restaurant);
}
});
}
以及在您在使用以下代码的 mainactivity 中定义适配器对象之后...
adpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
@Override
public void onItemClick(restaurant restaurantobj) {
restaurantobj.setActive(true);
restaurantList.add(restaurantobj);
adpater.notifyDataSetChanged();
}
});