2017-03-13 2 views
0

Ich bin mit diesem Problem nur auf Android Nougat konfrontiert. Nach dem Ziehen und Ablegen eines Elements wird das OnClick-Ereignis nicht mehr ausgelöst.android - RecyclerView Element nicht anklickbar nach Drag & Drop in Nougat (Android 7.0)

Hier ist der 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); 
     } 
    } 
} 

Und hier ist der Callback-Touch-Helfer Artikel:

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; 
    } 
} 

Jede Hilfe würde geschätzt, danke!

Antwort

0

Ich hatte jedes notifyDataSet geändert und ersetzen sie durch andere notifyXXX (notifyItemRangeInserted, notifyItemRangeRemoved, notifyItemRangeChanged usw.)

entfernen
Verwandte Themen