Java 在recyclerview中显示值(基于布尔值)会为所有项目返回相同的结果

Java 在recyclerview中显示值(基于布尔值)会为所有项目返回相同的结果,java,android,android-recyclerview,android-adapter,boolean-expression,Java,Android,Android Recyclerview,Android Adapter,Boolean Expression,我有一个回收站,里面有很多东西。我使用适配器从服务器填充recyclerview,即名称、日期、时间等,它工作正常 我遇到的唯一问题是,我尝试根据布尔值填充它。当我尝试添加图像星形时(对于收藏夹选项),以及当我尝试设置是否关闭时(对于活动选项),我总是会收到带有“收藏夹图标”和“已关闭”消息的所有项目 例如,当工作时间返回为false时,我尝试执行的操作如下: if (!restaurant.getActive()) { holder.isClosed.setVisibility(Vie

我有一个回收站,里面有很多东西。我使用适配器从服务器填充recyclerview,即名称、日期、时间等,它工作正常

我遇到的唯一问题是,我尝试根据布尔值填充它。当我尝试添加图像星形时(对于收藏夹选项),以及当我尝试设置是否关闭时(对于活动选项),我总是会收到带有“收藏夹图标”和“已关闭”消息的所有项目

例如,当工作时间返回为false时,我尝试执行的操作如下:

if (!restaurant.getActive()) {
    holder.isClosed.setVisibility(View.VISIBLE);
}
当我在RestaurantDescriptionActivity中设置布尔值时,它工作得很好,它在服务器上按应有的方式保存和更新,并且它还返回正确的值,所以我不确定我的错误可能在哪里

我在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);
    }

}
class RestaurantViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图餐厅名称、日期、时间已关闭;
ImageView缩略图,我最喜欢;
RestaurantViewHolder(查看项目视图){
超级(项目视图);
缩略图=itemView.findViewById(R.id.缩略图);
isfavorite=itemView.findviewbyd(R.id.imageviewisfavorite);
restaurantName=itemView.findViewById(R.id.restaurantName图标);
日期=itemView.findViewById(R.id.date);
时间=itemView.findViewById(R.id.time);
isClosed=itemView.findviewbyd(R.id.restaurantIsClosed);
}
}
公共餐厅适配器(列表餐厅列表,上下文){
this.restaurantItems=restaurantList;
this.context=上下文;
}
@凌驾
公共餐厅Adapter.restaurantsViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutFlater.from(parent.getContext()).flate(R.layout.list\u row\u restaurant,parent,false);
返回新的RestaurantViewHolder(itemView);
}
@凌驾
BindViewHolder上的公共无效(RestaurantAdapter.RestaurantViewHolder,内部位置){
//正在获取该行的餐厅数据
餐厅=餐厅获得(职位);
holder.restaurantName.setText(restaurant.getrestaurantName());
LocalDateTime ldt=LocalDateTime.parse(restaurant.getDateTime(),DateTimeFormatter.of模式(“yyyy-MM-dd-HH:MM:ss”);
字符串formattedDate=ldt.format(getLocalizedDateFormatter(Locale.getDefault());
holder.date.setText(格式日期);
//holder.date.setText(convertDate(restaurant.getDateTime());//字符串dobiti u formatu,pretvoriti ga u localized i podijeliti na dva dijela
holder.time.setText(convertTime(restaurant.getDateTime());
holder.isfavorite.clearColorFilter();
如果(!restaurant.getActive()){
holder.isClosed.setVisibility(View.GONE);
}
if(restaurant.getisfavorite()){
holder.isfavorite.setImageResource(R.drawable.ic\u icon\u star\u ppdcolor);
}
}

您需要对RecyclerView项中的其他部分进行编码,否则它将重新填充其以前的视图状态

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);
}

为喜爱的点击事件创建界面,并在下面代码中使用的主要活动中将该记录值设置为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);
        }
    });
 }
adpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
        @Override
        public void onItemClick(restaurant restaurantobj) {
            restaurantobj.setActive(true);
            restaurantList.add(restaurantobj);
            adpater.notifyDataSetChanged();
        }
    });
当您在mainactivity中定义下面代码中使用的适配器对象之后

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);
        }
    });
 }
adpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
        @Override
        public void onItemClick(restaurant restaurantobj) {
            restaurantobj.setActive(true);
            restaurantList.add(restaurantobj);
            adpater.notifyDataSetChanged();
        }
    });

可能是您从中获取irestaurant.getActive()始终为falseserver@YahyaMukhtar不,当我打开我的RestaurantDescriptionActivity(我可以查看从recyclerview打开的单个项目的活动)时,我得到的结果是正确的。谢谢Kunu,我今晚将尝试这个,并让您知道(希望通过接受您的答案:)。在调试期间,我的适配器中总是会出现false,尽管几乎所有这些都是true,并且当我打开single restaurantActivity时,我会得到正确的值。这是因为包裹吗?我已经更新了我的代码。我不认为包裹会做这样的事情。检查值更改时是否正在更新RecyclerView数据集。今晚我将查看此信息并通知您。谢谢你的详细回答。我不想在这里添加onClick,只想在recyclerview项上显示/隐藏图标或文本。在调试期间,适配器中的值总是为false,尽管几乎所有的值都为true,当我打开single restaurantActivity时,我得到了正确的值。这是因为包裹吗?我已经更新了我的代码。