简体   繁体   English

android-在牛轧糖中拖放后,RecyclerView项不可单击(Android 7.0)

[英]android - RecyclerView item not clickable after drag and drop in Nougat (Android 7.0)

I'm facing this issue only on android Nougat. 我仅在android Nougat上面临此问题。 After drag and dropping an item, the OnClick event doesn't fire on this item anymore. 拖放项目后,OnClick事件将不再触发该项目。

Here's the adapter : 这是适配器:

public class VideoListAdapter extends RecyclerView.Adapter<VideoListAdapter.VideoListViewHolder> implements ItemTouchHelperAdapter {

    private List<Media> videos;
    private LayoutInflater inflater;
    private Context context;

    private int selectedItemPosition;
    private Media selectedMedia;
    private static final int NOTHING_SELECTED = -1;

    public VideoListAdapter(Context context, List<Media> videos, Delegate delegate) {
        inflater = LayoutInflater.from(context);
        setVideos(videos);
        this.context = context;
        setSelectedItem(NOTHING_SELECTED);
    }

    public void setSelectedItem(int pos) {
        selectedItemPosition = pos;
        if(pos != NOTHING_SELECTED)
            selectedMedia = videos.get(pos);
        else
            selectedMedia = null;
    }

    public void setVideos(List<Media> videos) {
        this.videos = videos;
        setSelectedItem(NOTHING_SELECTED);
    }

    private void onVideosReordered() {
        if(selectedMedia != null)
            setSelectedItem(videos.indexOf(selectedMedia));
    }

    public void unselectAll() {
        setSelectedItem(NOTHING_SELECTED);
        notifyDataSetChanged();
    }

    @Override
    public VideoListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_video_list, parent, false);
        return new VideoListViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final VideoListViewHolder holder, int position) {
        String imagePath = videos.get(position).getFilePath();

        boolean isEmptyItem = imagePath == null || imagePath.isEmpty();

        if (isEmptyItem) {
            holder.video_list_item_selected.setVisibility(View.GONE);
            holder.img_image.setVisibility(View.GONE);
        } else {

            UtilsMedia.loadThumbnailImageNoSpinAnimation(holder.img_image, imagePath);

            boolean isSelected = selectedItemPosition == position;
            if (isSelected && !isEmptyItem)
                holder.video_list_item_selected.setVisibility(View.VISIBLE);
            else
                holder.video_list_item_selected.setVisibility(View.GONE);
        }
    }

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

    @Override
    public boolean onItemMove(int fromPosition, int toPosition) {

        if (fromPosition < toPosition) {
            for (int i = fromPosition; i < toPosition; i++)
                Collections.swap(videos, i, i + 1);
        } else {
            for (int i = fromPosition; i > toPosition; i--)
                Collections.swap(videos, i, i - 1);
        }

        notifyItemMoved(fromPosition, toPosition);

        return true;
    }

    @Override
    public void onItemDropped() {
        onVideosReordered();
        notifyDataSetChanged();
    }

    class VideoListViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
        public ImageView img_image;
        public ImageView video_list_item_selected;
        public FrameLayout fl_root;
        public Context context;
        public boolean isSelected;

        private static final String TAG = "VideoListViewHolder";

        public VideoListViewHolder(View view) {
            super(view);
            img_image = (ImageView) view.findViewById(R.id.img_image);
            video_list_item_selected = (ImageView) view.findViewById(R.id.video_list_item_selected);
            fl_root = (FrameLayout) view.findViewById(R.id.fl_root);
            context = view.getContext();
            isSelected = false;

            fl_root.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int currentPosition = getAdapterPosition();

                    if (selectedItemPosition == currentPosition) {
                        setSelectedItem(NOTHING_SELECTED);
                    } else {
                        if (selectedItemPosition != -1)
                            notifyItemChanged(selectedItemPosition);
                        setSelectedItem(currentPosition);

                    }

                    notifyItemChanged(currentPosition);
                }
            });
        }

        @Override
        public void onItemSelected() {
            final Animation zoomOut = AnimationUtils.loadAnimation(context, R.anim.zoom_out);
            zoomOut.setDuration(300);
            fl_root.startAnimation(zoomOut);
        }

        @Override
        public void onItemClear() {
            final Animation zoomIn = AnimationUtils.loadAnimation(context, R.anim.zoom_in);
            zoomIn.setDuration(300);
            fl_root.startAnimation(zoomIn);
        }
    }
}

And here is the item touch helper callback : 这是项touch helper回调:

public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
    public static final float ALPHA_FULL = 1.0f;

    protected final ItemTouchHelperAdapter mAdapter;

    public ItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
        mAdapter = adapter;
    }

    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    @Override
    public boolean isItemViewSwipeEnabled() {
        return false;
    }

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        final int swipeFlags = 0;
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    private int moveSource = -1;
    private int moveTarget = -1;

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
        if (source.getItemViewType() != target.getItemViewType()) 
            return false;

        if(moveSource == -1)
            moveSource = source.getAdapterPosition();

        moveTarget = target.getAdapterPosition();

        mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) {
    }

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }

    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
            ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
            itemViewHolder.onItemSelected();
        }
        super.onSelectedChanged(viewHolder, actionState);
    }

    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);
        viewHolder.itemView.setAlpha(ALPHA_FULL);
        if (viewHolder instanceof ItemTouchHelperViewHolder) {
            ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
            itemViewHolder.onItemClear();
        }

        if(moveSource != -1 && moveTarget != -1 && moveSource != moveTarget) 
            mAdapter.onItemDropped();

        moveSource = moveTarget = -1;
    }
} 

Any help would be appreciated, thanks ! 任何帮助,将不胜感激,谢谢!

我必须删除所有更改的notifyDataSet,并用其他notifyXXX(notifyItemRangeInserted,notifyItemRangeRemoved,notifyItemRangeChanged等)替换它们

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM