栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

RecyclerView实现侧滑拖拽功能

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RecyclerView实现侧滑拖拽功能

本文实例为大家分享了RecyclerView实现侧滑拖拽功能的具体代码,供大家参考,具体内容如下

准备

ItemDragListener

package slideslipdrag;

import android.support.v7.widget.RecyclerView;


public interface ItemDragListener {
 
 void onStartDrag(RecyclerView.ViewHolder viewHolder);
}

ItemTouchHelperAdapter

package slideslipdrag;


public interface ItemTouchHelperAdapter {
 
 void onItemMove(int fromPosition, int toPosition);

 
 void onItemSlideSlipEnd(int position);
}

ItemTouchHelperViewHolder

package slideslipdrag;

import android.content.Context;


public interface ItemTouchHelperViewHolder {
  
  void onItemSlideSlipStart(Context context);

  
  void onItemSlideSlipStop(Context context);
}

SimpleItemTouchHelperCallback

package slideslipdrag;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.View;

import com.self.zsp.dfs.R;

import util.DensityUtils;


public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
  private final ItemTouchHelperAdapter mAdapter;
  private Context context;
  private Paint paint = new Paint();

  public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter, Context context) {
    mAdapter = adapter;
    this.context = context;
  }

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

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

  @Override
  public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    // Enable drag up and down and right swipe in right direction
    final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
    final int swipeFlags = ItemTouchHelper.END;
    // final int swipeFlags = ItemTouchHelper.END | ItemTouchHelper.START; Enable swipe in both direction
    return makeMovementFlags(dragFlags, swipeFlags);
  }

  @Override
  public long getAnimationDuration(RecyclerView recyclerView, int animationType, float animateDx, float animateDy) {
    // return animationType == ItemTouchHelper.ANIMATION_TYPE_DRAG ? DEFAULT_DRAG_ANIMATION_DURATION : DEFAULT_SWIPE_ANIMATION_DURATION;
    return animationType == ItemTouchHelper.ANIMATION_TYPE_DRAG ? DEFAULT_DRAG_ANIMATION_DURATION : 350;
  }

  @Override
  public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
    if (source.getItemViewType() != target.getItemViewType()) {
      return false;
    }
    // Notify the adapter of the move
    mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());
    return true;
  }

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

  @Override
  public void onSwiped(final RecyclerView.ViewHolder viewHolder, int i) {
    // Notify the adapter of the dismissal
    mAdapter.onItemSlideSlipEnd(viewHolder.getAdapterPosition());
  }

  @Override
  public int getBoundingBoxMargin() {
    return super.getBoundingBoxMargin();
  }

  @Override
  public void onChildDraw(final Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    // Fade out the view as it is swiped out of the parent's bounds
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
      View itemView = viewHolder.itemView;
      Bitmap icon;
      if (dX > 0) {
 icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.delete);
 // Set color for right swipe
 paint.setColor(ContextCompat.getColor(context, R.color.red));
 // Draw Rect with varying right side, equal to displacement dX
 c.drawRect((float) itemView.getLeft() + DensityUtils.dpToPxFour(0), (float) itemView.getTop(), dX + DensityUtils.dpToPxFour(0),
     (float) itemView.getBottom(), paint);
 // Set the image icon for right swipe
 c.drawBitmap(icon, (float) itemView.getLeft() + DensityUtils.dpToPxFour(16), (float) itemView.getTop() +
     ((float) itemView.getBottom() - (float) itemView.getTop() - icon.getHeight()) / 2, paint);
 icon.recycle();
      }
    }
  }

  @Override
  public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
    if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
      // Let the view holder know that this item is being moved or dragged
      ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
      itemViewHolder.onItemSlideSlipStart(context);
    }
    super.onSelectedChanged(viewHolder, actionState);
    
  }

  @Override
  public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    super.clearView(recyclerView, viewHolder);
    // Tell the view holder it's time to restore the idle state
    ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
    itemViewHolder.onItemSlideSlipStop(context);

  }

  @Override
  public float getMoveThreshold(RecyclerView.ViewHolder viewHolder) {
    
    return 0.1f;
    
  }

  @Override
  public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
    
    return 0.9f;
  }
}

使用

布局




  

    

    

    
  

  

适配器

package adapter.parameterconfiguration;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.PorterDuff;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.self.zsp.dfs.R;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import entity.sync.Ground;
import butterknife.BindView;
import butterknife.ButterKnife;
import slideslipdrag.ItemDragListener;
import slideslipdrag.ItemTouchHelperAdapter;
import slideslipdrag.ItemTouchHelperViewHolder;
import util.ToastUtils;


public class ParaConfigChooseGroundAdapter extends RecyclerView.Adapter implements View.OnClickListener, View.OnLongClickListener, ItemTouchHelperAdapter {
  private Context context;
  private List groundList;
  private int viewStateReceive;
  private onRecyclerViewItemClickListener mOnItemClickListener;
  private onRecyclerViewItemLongClickListener mOnItemLongClickListener;
  private final ItemDragListener dragStartListener;
  private int selectPosition = -1;

  
  public ParaConfigChooseGroundAdapter(Context context, int viewState, ItemDragListener dragStartListener) {
    this.context = context;
    this.dragStartListener = dragStartListener;
    groundList = new ArrayList<>();
    viewStateReceive = viewState;
  }

  private void setSelectPosition(int selectPosition) {
    this.selectPosition = selectPosition;
  }

  public void setParaConfigChooseGroundData(List list) {
    this.groundList = list;
  }

  @Override
  public int getItemCount() {
    if (groundList != null && groundList.size() > 0) {
      return groundList.size();
    }
    return 0;
  }

  @Override
  public void onClick(View v) {
    if (monItemClickListener != null) {
      // Method getTag which get data.
      mOnItemClickListener.onItemClick(v, (Ground) v.getTag());
    }
  }

  @Override
  public boolean onLongClick(View v) {
    if (monItemLongClickListener != null) {
      // Method getTag which get data.
      mOnItemLongClickListener.onItemLongClick(v, (Ground) v.getTag());
    }
    return true;
  }

  public void setonItemClickListener(onRecyclerViewItemClickListener listener) {
    this.monItemClickListener = listener;
  }

  public void setonItemLongClickListener(onRecyclerViewItemLongClickListener listener) {
    this.monItemLongClickListener = listener;
  }

  @NonNull
  @Override
  public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // inflate(R.layout.list_item_record,parent,false)不这么写则cardview不适宽
    View view = LayoutInflater.from(context).inflate(R.layout.basic_config_choose_item, parent, false);
    // 为所创View注册点击事件
    view.setonClickListener(this);
    view.setonLongClickListener(this);
    return new ViewHolder(view);
  }

  @SuppressLint("ClickableViewAccessibility")
  @Override
  public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
    final Ground ground = groundList.get(position);
    // 数据存itemView之Tag以便点获
    holder.itemView.setTag(ground);
    // 值
    holder.tvBasicConfigChoose.setText(ground.getDcmc());
    switch (viewStateReceive) {
      case 0:
 // 选否
 if (selectPosition == position) {
   holder.cbBasicConfigChoose.setChecked(true);
 } else {
   holder.cbBasicConfigChoose.setChecked(false);
 }
 // CheckBox
 holder.cbBasicConfigChoose.setonClickListener(new View.onClickListener() {
   @Override
   public void onClick(View v) {
     if (selectPosition == holder.getAdapterPosition()) {
// 选则取消
setSelectPosition(-1);
mOnItemClickListener.onItemChoose(ground, false);
     } else {
// 未选则选
setSelectPosition(holder.getAdapterPosition());
mOnItemClickListener.onItemChoose(ground, true);
     }
     notifyDataSetChanged();
   }
 });
 // ConvertView
 holder.itemView.setonClickListener(new View.onClickListener() {
   @Override
   public void onClick(View v) {
     if (selectPosition == holder.getAdapterPosition()) {
// 选则取消
setSelectPosition(-1);
mOnItemClickListener.onItemChoose(ground, false);
     } else {
// 未选则选
setSelectPosition(holder.getAdapterPosition());
mOnItemClickListener.onItemChoose(ground, true);
     }
     notifyDataSetChanged();
   }
 });
 break;
      case 1:
 holder.cbBasicConfigChoose.setVisibility(View.INVISIBLE);
 holder.ivBasicConfigChoose.setVisibility(View.VISIBLE);
 break;
      default:
 break;
    }
    holder.ivBasicConfigChoose.setonTouchListener(new View.onTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
 switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:
     dragStartListener.onStartDrag(holder);
     break;
   default:
     break;
 }
 return false;
      }
    });
  }

  @Override
  public void onItemMove(int fromPosition, int toPosition) {
    if (fromPosition < toPosition) {
      for (int i = fromPosition; i < toPosition; i++) {
 Collections.swap(groundList, i, i + 1);
      }
    } else {
      for (int i = fromPosition; i > toPosition; i--) {
 Collections.swap(groundList, i, i - 1);
      }
    }
    notifyItemMoved(fromPosition, toPosition);
  }

  @Override
  public void onItemSlideSlipEnd(int position) {
    Ground ground = groundList.get(position);
    switch (ground.getLocalAdd()) {
      case 1:
 notifyItemRemoved(position);
 groundList.remove(position);
 notifyItemRangeChanged(0, getItemCount());
 ground.delete();
 break;
      default:
 notifyItemRangeChanged(0, getItemCount());
 ToastUtils.shortShow(context.getString(R.string.localMaintainedDataDeleteHint));
 break;
    }
  }

  public interface onRecyclerViewItemClickListener {
    
    void onItemClick(View view, Ground ground);

    
    void onItemChoose(Ground ground, boolean choose);
  }

  public interface onRecyclerViewItemLongClickListener {
    
    void onItemLongClick(View view, Ground ground);
  }

  
  class ViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
    @BindView(R.id.llBasicConfigChoose)
    LinearLayout llBasicConfigChoose;
    @BindView(R.id.tvBasicConfigChoose)
    TextView tvBasicConfigChoose;
    @BindView(R.id.ivBasicConfigChoose)
    ImageView ivBasicConfigChoose;
    @BindView(R.id.cbBasicConfigChoose)
    CheckBox cbBasicConfigChoose;

    ViewHolder(final View view) {
      super(view);
      ButterKnife.bind(this, view);
    }

    @Override
    public void onItemSlideSlipStart(Context context) {
      llBasicConfigChoose.setBackgroundColor(ContextCompat.getColor(context, R.color.blue));
      tvBasicConfigChoose.setTextColor(ContextCompat.getColor(context, R.color.background));
      ivBasicConfigChoose.setColorFilter(ContextCompat.getColor(context, R.color.background), PorterDuff.Mode.SRC_IN);
    }

    @Override
    public void onItemSlideSlipStop(Context context) {
      llBasicConfigChoose.setBackgroundColor(ContextCompat.getColor(context, R.color.background));
      tvBasicConfigChoose.setTextColor(ContextCompat.getColor(context, R.color.fontInput));
      ivBasicConfigChoose.setColorFilter(ContextCompat.getColor(context, R.color.blue), PorterDuff.Mode.SRC_IN);
    }
  }
}

主代码

package adapter.parameterconfiguration;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.PorterDuff;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.self.zsp.dfs.R;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import entity.sync.Ground;
import butterknife.BindView;
import butterknife.ButterKnife;
import slideslipdrag.ItemDragListener;
import slideslipdrag.ItemTouchHelperAdapter;
import slideslipdrag.ItemTouchHelperViewHolder;
import util.ToastUtils;


public class ParaConfigChooseGroundAdapter extends RecyclerView.Adapter implements View.OnClickListener, View.OnLongClickListener, ItemTouchHelperAdapter {
  private Context context;
  private List groundList;
  private int viewStateReceive;
  private onRecyclerViewItemClickListener mOnItemClickListener;
  private onRecyclerViewItemLongClickListener mOnItemLongClickListener;
  private final ItemDragListener dragStartListener;
  private int selectPosition = -1;

  
  public ParaConfigChooseGroundAdapter(Context context, int viewState, ItemDragListener dragStartListener) {
    this.context = context;
    this.dragStartListener = dragStartListener;
    groundList = new ArrayList<>();
    viewStateReceive = viewState;
  }

  private void setSelectPosition(int selectPosition) {
    this.selectPosition = selectPosition;
  }

  public void setParaConfigChooseGroundData(List list) {
    this.groundList = list;
  }

  @Override
  public int getItemCount() {
    if (groundList != null && groundList.size() > 0) {
      return groundList.size();
    }
    return 0;
  }

  @Override
  public void onClick(View v) {
    if (monItemClickListener != null) {
      // Method getTag which get data.
      mOnItemClickListener.onItemClick(v, (Ground) v.getTag());
    }
  }

  @Override
  public boolean onLongClick(View v) {
    if (monItemLongClickListener != null) {
      // Method getTag which get data.
      mOnItemLongClickListener.onItemLongClick(v, (Ground) v.getTag());
    }
    return true;
  }

  public void setonItemClickListener(onRecyclerViewItemClickListener listener) {
    this.monItemClickListener = listener;
  }

  public void setonItemLongClickListener(onRecyclerViewItemLongClickListener listener) {
    this.monItemLongClickListener = listener;
  }

  @NonNull
  @Override
  public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // inflate(R.layout.list_item_record,parent,false)不这么写则cardview不适宽
    View view = LayoutInflater.from(context).inflate(R.layout.basic_config_choose_item, parent, false);
    // 为所创View注册点击事件
    view.setonClickListener(this);
    view.setonLongClickListener(this);
    return new ViewHolder(view);
  }

  @SuppressLint("ClickableViewAccessibility")
  @Override
  public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
    final Ground ground = groundList.get(position);
    // 数据存itemView之Tag以便点获
    holder.itemView.setTag(ground);
    // 值
    holder.tvBasicConfigChoose.setText(ground.getDcmc());
    switch (viewStateReceive) {
      case 0:
 // 选否
 if (selectPosition == position) {
   holder.cbBasicConfigChoose.setChecked(true);
 } else {
   holder.cbBasicConfigChoose.setChecked(false);
 }
 // CheckBox
 holder.cbBasicConfigChoose.setonClickListener(new View.onClickListener() {
   @Override
   public void onClick(View v) {
     if (selectPosition == holder.getAdapterPosition()) {
// 选则取消
setSelectPosition(-1);
mOnItemClickListener.onItemChoose(ground, false);
     } else {
// 未选则选
setSelectPosition(holder.getAdapterPosition());
mOnItemClickListener.onItemChoose(ground, true);
     }
     notifyDataSetChanged();
   }
 });
 // ConvertView
 holder.itemView.setonClickListener(new View.onClickListener() {
   @Override
   public void onClick(View v) {
     if (selectPosition == holder.getAdapterPosition()) {
// 选则取消
setSelectPosition(-1);
mOnItemClickListener.onItemChoose(ground, false);
     } else {
// 未选则选
setSelectPosition(holder.getAdapterPosition());
mOnItemClickListener.onItemChoose(ground, true);
     }
     notifyDataSetChanged();
   }
 });
 break;
      case 1:
 holder.cbBasicConfigChoose.setVisibility(View.INVISIBLE);
 holder.ivBasicConfigChoose.setVisibility(View.VISIBLE);
 break;
      default:
 break;
    }
    holder.ivBasicConfigChoose.setonTouchListener(new View.onTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
 switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:
     dragStartListener.onStartDrag(holder);
     break;
   default:
     break;
 }
 return false;
      }
    });
  }

  @Override
  public void onItemMove(int fromPosition, int toPosition) {
    if (fromPosition < toPosition) {
      for (int i = fromPosition; i < toPosition; i++) {
 Collections.swap(groundList, i, i + 1);
      }
    } else {
      for (int i = fromPosition; i > toPosition; i--) {
 Collections.swap(groundList, i, i - 1);
      }
    }
    notifyItemMoved(fromPosition, toPosition);
  }

  @Override
  public void onItemSlideSlipEnd(int position) {
    Ground ground = groundList.get(position);
    switch (ground.getLocalAdd()) {
      case 1:
 notifyItemRemoved(position);
 groundList.remove(position);
 notifyItemRangeChanged(0, getItemCount());
 ground.delete();
 break;
      default:
 notifyItemRangeChanged(0, getItemCount());
 ToastUtils.shortShow(context.getString(R.string.localMaintainedDataDeleteHint));
 break;
    }
  }

  public interface onRecyclerViewItemClickListener {
    
    void onItemClick(View view, Ground ground);

    
    void onItemChoose(Ground ground, boolean choose);
  }

  public interface onRecyclerViewItemLongClickListener {
    
    void onItemLongClick(View view, Ground ground);
  }

  
  class ViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
    @BindView(R.id.llBasicConfigChoose)
    LinearLayout llBasicConfigChoose;
    @BindView(R.id.tvBasicConfigChoose)
    TextView tvBasicConfigChoose;
    @BindView(R.id.ivBasicConfigChoose)
    ImageView ivBasicConfigChoose;
    @BindView(R.id.cbBasicConfigChoose)
    CheckBox cbBasicConfigChoose;

    ViewHolder(final View view) {
      super(view);
      ButterKnife.bind(this, view);
    }

    @Override
    public void onItemSlideSlipStart(Context context) {
      llBasicConfigChoose.setBackgroundColor(ContextCompat.getColor(context, R.color.blue));
      tvBasicConfigChoose.setTextColor(ContextCompat.getColor(context, R.color.background));
      ivBasicConfigChoose.setColorFilter(ContextCompat.getColor(context, R.color.background), PorterDuff.Mode.SRC_IN);
    }

    @Override
    public void onItemSlideSlipStop(Context context) {
      llBasicConfigChoose.setBackgroundColor(ContextCompat.getColor(context, R.color.background));
      tvBasicConfigChoose.setTextColor(ContextCompat.getColor(context, R.color.fontInput));
      ivBasicConfigChoose.setColorFilter(ContextCompat.getColor(context, R.color.blue), PorterDuff.Mode.SRC_IN);
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/155790.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号