RecyclerView不会在Android 5.1.1上更新UI

时间:2017-11-08 00:59:17

标签: android android-recyclerview visibility

我有一个问题,只能在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(); }

2 个答案:

答案 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)

将onClick更改为:

后,

更新解决方案

     @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工作无法预测。