0

我有一个由两部分组成的问题,希望有人能提供帮助。本质上,我正在从 API 读取数据。API 的结果之一(在我为应用程序制作的自定义库中)是结果是否有图像。

我正在尝试添加功能,用户可以在其中删除卡片并且如果它们没有图像则不显示它们。我希望能够在加载时(他们存储选择)或在运行时执行此操作。

问题一

在使用卡片视图填充回收站视图时,是否可以专门省略某些项目?我可以使图像保持在外面,但这对实际将卡片留在外面的问题没有帮助。

问题二

是否可以即时从回收站视图中删除多个项目?我尝试过的是循环遍历所有列表项,如果它们没有图像,我会删除它们。问题是这仅在一半时间内有效,并且当它完成时需要单击 4 次并带有一个复选框。

注意:下面的代码在 onCheckedChangedListener 里面

if(imageOnly.isChecked()){
    image = true;
    for(int i = 0; i < strains.size(); i++){
        if(strains.get(i) != null) {
            if (strains.get(i).getImage().equalsIgnoreCase(getContext().getResources().getString(R.string.no_image))) {
                strains.remove(i);
                adapter.notifyItemRemoved(i);
            }
        }
     }
     adapter.notifyDataSetChanged();
}else{
   image = false;
}

添加适配器

public class StrainCardAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private final List<Strain> strains;
    private Context context;
    private boolean imageOnly;

    public StrainCardAdapter(List<Strain> strains, Context context, boolean imageOnly) {
        this.strains = strains;
        this.context = context;
        this.imageOnly = imageOnly;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.strain_card_view, parent, false);
        StrainViewHolder svh = new StrainViewHolder(v);
        return svh;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (!strains.get(position).getImage().equals(context.getResources().getString(R.string.no_image))) {
            Picasso.with(context).load(strains.get(position).getImage()).into(((StrainViewHolder) holder).strainImage);
        }
    }

    @Override
    public int getItemCount() {
        return strains.size();
    }

    public static class StrainViewHolder extends RecyclerView.ViewHolder {
        CardView strainCard;
        ImageView strainImage;

        public StrainViewHolder(View itemView) {
            super(itemView);
            strainCard = (CardView) itemView.findViewById(R.id.strain_card);
            strainImage = (ImageView) itemView.findViewById(R.id.strain_image);
        }
    }

}
4

1 回答 1

0

您可以,一旦从您所做的 API 调用中获得响应对象,您就可以检查它们是否包含图像。我猜你有办法确定它。假设您有一个与之关联的 imageUrl;表示空图像可能是您使用的是空字符串或 null。

遍历对象并选择具有图像的对象应该是要走的路。

ArrayList<Strain> strainsList = new ArrayList<>();
String noImage = getContext().getResources().getString(R.string.no_image)
for( Strain strain : responseObjects ) {
  if( !strain.getImage().equalsIgnoreCase(noImage) ) {
      strainsList.add(strain);
  }
} 

strains.addAll( strainsList ); //Assuming strains is the arraylist used by your adapter
adapter.notifyDataSetChanged();

删除项目应该是直截了当的:

您可以在适配器的项目布局中添加一个图像指示项目可以被删除[可能是一个红色的 X];单击它可以删除单击的项目。

public static class StrainViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        CardView strainCard;
        ImageView strainImage;
        ImageView removeImageView;

        public StrainViewHolder(View itemView) {
            super(itemView);
            strainCard = (CardView) itemView.findViewById(R.id.strain_card);
            strainImage = (ImageView) itemView.findViewById(R.id.strain_image);
            removeImageView = (ImageView) itemView.findViewById(R.id.remove_image_view);
            removeImageView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
           if( v.getId() == R.id.remove_image_view ) {
              int position = getAdapterPosition(); 
              if( position != RecyclerView.NO_POSITION ) {
                 strains.remove(position);
                 notifyItemRemoved(position);
              }
           }
        }
    }

让我知道是否需要更多说明。

于 2016-09-23T12:01:11.273 回答