RecyclerView - 删除项目并将项目保留

时间:2016-09-22 17:44:50

标签: android list android-recyclerview cardview

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

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

问题一

在使用cardviews填充Recyclerview时,是否可以专门省略某些项目?我可以让图像保持不变但它对实际离开卡的问题没有帮助。

问题二

是否可以动态删除回收者视图中的多个项目?我试过的是循环遍历所有List项目的for循环,如果他们没有图像我删除它们。问题是,这只能工作一半的时间,只需要点击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);
        }
    }

}

1 个答案:

答案 0 :(得分: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);
              }
           }
        }
    }

如果需要进一步澄清,请告诉我。