我有一个问题,只能在Android 5.1.1和5.1上的少数设备上重复使用。其余版本的工作正常。
Recycler视图有onClick侦听器,我尝试将视图可见性从GONE更新为VISIBLE或相反。点击项目后,UI上没有任何变化。 注意:如果我关闭(BackButton)片段并再次打开 - 将更新UI。即使按下后退按钮,我也会在销毁之前看到UI更新几毫秒。
我尝试通知所有适配器,当前项,无效itemView,swap()并再次设置适配器但没有成功。 所有方法setVisibility(),onClick,Callbacks,BindView都被成功调用(调试器)。
public class PhotoGalleryAdapter extends RecyclerView.Adapter<PhotoGalleryAdapter.PhotoHolder> {
private Context context;
private List<String> photos;
private View.OnClickListener listener;
public PhotoGalleryAdapter(Context context, List<String> photos, View.OnClickListener listener) {
this.context = context;
this.photos = photos;
this.listener = listener;
}
@Override
public PhotoGalleryAdapter.PhotoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_photo, parent, false);
return new PhotoHolder(v, listener);
}
@Override
public void onBindViewHolder(final PhotoGalleryAdapter.PhotoHolder holder, int position) {
String photoPath = photos.get(position);
Glide.with(context)
.load(photoPath)
.thumbnail(0.1f)
.into(holder.image);
if (Utils.getSelectedPhotos().contains(photoPath)) {
DrawableCompat.setTint(holder.selection.getDrawable(), ContextCompat.getColor(context, R.color.white));
holder.selection.setVisibility(View.VISIBLE);
} else {
holder.selection.setVisibility(View.GONE);
}
}
@Override
public int getItemCount() {
return photos.size();
}
public void updateDataSet(List<String> photos) {
if (!photos.equals(this.photos)) {
this.photos.clear();
this.photos.addAll(photos);
notifyDataSetChanged();
}
}
class PhotoHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@BindView(R.id.imageView) AppCompatImageView image;
@BindView(R.id.selectionState) AppCompatImageView selection;
private View.OnClickListener listener;
PhotoHolder(View view, View.OnClickListener listener) {
super(view);
ButterKnife.bind(this, view);
view.setOnClickListener(this);
this.listener = listener;
}
@Override
public void onClick(View view) {
if (Utils.getSelectedPhotos().contains(photos.get(getAdapterPosition()))) {
selection.setVisibility(View.GONE);
Utils.getSelectedPhotos().remove(photos.get(getAdapterPosition()));
} else {
Utils.getSelectedPhotos().add(photos.get(getAdapterPosition()));
DrawableCompat.setTint(selection.getDrawable(), ContextCompat.getColor(context, R.color.white));
selection.setVisibility(View.VISIBLE);
}
listener.onClick(view);
}
}
}
回调:
@Override public void onClick(View view) {
callbacks.onPhotoSelected(Utils.getSelectedPhotos().size());
adapter.notifyDataSetChanged(); }
答案 0 :(得分:0)
根据您的PhotoGalleryAdapter
。
public void updateDataSet(List<String> photos) {
if (!photos.equals(this.photos)) {
this.photos.clear();
this.photos.addAll(photos);
notifyDataSetChanged();
}
}
你使用
if (Utils.getSelectedPhotos().contains(photoPath)) {
DrawableCompat.setTint(holder.selection.getDrawable(), ContextCompat.getColor(context, R.color.white));
holder.selection.setVisibility(View.VISIBLE);
} else {
holder.selection.setVisibility(View.GONE);
}
此行Utils.getSelectedPhotos()
未更新。
问题是callbacks.onPhotoSelected(Utils.getSelectedPhotos().size());
。
您可以使用updateDataSet
更新用户界面。
点击。你可以这样使用。
Utils.setSelectedPhotos(yourList);
adapter.updateDataSet(yourList);
修改强>
您应首先更新列表,然后使用notifyDataSetChanged
。
所以你的列表没有更新,你应该检查它。
答案 1 :(得分:0)
更新解决方案
@Override
public void onClick(View view) {
if (Utils.getSelectedPhotos().contains(photos.get(getAdapterPosition()))) {
Utils.getSelectedPhotos().remove(photos.get(getAdapterPosition()));
} else {
Utils.getSelectedPhotos().add(photos.get(getAdapterPosition()));
}
notifyDataSetChanged();
listener.onClick(view);
}
仅使用LinearLayoutManager正常,但。仍然不适用于GridLayoutManager。 因此,在调用setVisibility()两次后,Android工作无法预测。