我有一个由两部分组成的问题,我希望有人可以提供帮助。 基本上我正在从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);
}
}
}
答案 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);
}
}
}
}
如果需要进一步澄清,请告诉我。