Android 에서 RecyclerView 드래그,사 이 드 삭제 기능 의 구현 코드

잔말 말고 효 과 를 보 여 드 리 겠 습 니 다.
RecyclerViewDrag
GridView 메 인 파일 구현 입 니 다.

public class GridViewActivity extends AppCompatActivity {
  RecyclerView mRecyclerView;
  List<String> mStringList;
  RecyclerAdapter mRecyAdapter;
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recyclerview);
    initView();
    initRecy();
  }
  private void initView() {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    mRecyclerView = (RecyclerView) findViewById(R.id.view_recycler);
  }
  private void initRecy() {
    if (mStringList == null) {
      mStringList = new ArrayList<>();
    }
    mStringList.addAll(DataManager.getData(20 - mStringList.size()));
    mRecyAdapter = new RecyclerAdapter(R.layout.item_gridview, mStringList, true);
    mRecyclerView.setLayoutManager(new GridLayoutManager(this, 4));
    mRecyclerView.addItemDecoration(new DividerGriItemDecoration(this));
    mRecyclerView.setHasFixedSize(true);
    RecyItemTouchHelperCallback itemTouchHelperCallback = new RecyItemTouchHelperCallback(mRecyAdapter, false, true);
    final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback);
    itemTouchHelper.attachToRecyclerView(mRecyclerView);
    mRecyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(mRecyclerView) {
      @Override
      public void onItemClick(RecyclerView.ViewHolder viewHolder) {
        RecyclerAdapter.ViewHolder viewHolder1 = (RecyclerAdapter.ViewHolder) viewHolder;
        String tvString = viewHolder1.mTextView.getText().toString();
        Toast.makeText(GridViewActivity.this, "     " + tvString, Toast.LENGTH_SHORT).show();
      }
      @Override
      public void onLongClick(RecyclerView.ViewHolder viewHolder) {
        RecyclerAdapter.ViewHolder viewHolder1 = (RecyclerAdapter.ViewHolder) viewHolder;
        String tvString = viewHolder1.mTextView.getText().toString();
        Toast.makeText(GridViewActivity.this, "        !", Toast.LENGTH_SHORT).show();
        if (viewHolder.getLayoutPosition() != 0) {
          itemTouchHelper.startDrag(viewHolder);
        }
      }
    });
    mRecyclerView.setAdapter(mRecyAdapter);
  }
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
      finish();
    }
    return super.onOptionsItemSelected(item);
  }
}
코드 는 이해 하기 어렵 지 않 습 니 다.바로 activity 에 초기 화 된 물건 을 많이 설치 하 는 것 입 니 다.RecyclerView 초기 화,setLayoutManager,addItemDecoration,setHasFixedSize,itemTouchHelper,addOnItemTouchListener,setAdapter.드래그 효과 의 핵심 코드 는 itemTouchHelper.startDrag(view Holder)입 니 다.다른 것 은 모두 그것 을 둘러싸 고 돈다.
그리고 각 설정 을 구체 적 으로 살 펴 보 세 요.
DataManager

public class DataManager {
  private static List<String> sStringList = Arrays.asList("  ", "  ", "  ", "  ",
      "  ", "  ", "  ", "  ", "  ", "  ");
  public static final List<String> getData(int number) {
    List<String> stringList = new ArrayList<>();
    for (int i = 0; i < number; i++) {
      stringList.add(sStringList.get(i % sStringList.size()));
    }
    return stringList;
  }
}
Divider Griitem Decoration 이 건 item 의 사 이 드 라인 을 그 렸 어 요.

public class DividerGriItemDecoration extends RecyclerView.ItemDecoration {
  private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
  private Drawable mDivider;
  private int lineWidth = 1;
  public DividerGriItemDecoration(GridViewActivity gridViewActivity) {
    final TypedArray array = gridViewActivity.obtainStyledAttributes(ATTRS);
    mDivider = array.getDrawable(0);
    array.recycle();
  }
  public DividerGriItemDecoration(int color) {
    mDivider = new ColorDrawable(color);
  }
  @Override
  public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
    drawHorizontal(c, parent);
    drawVertical(c, parent);
  }
  private void drawHorizontal(Canvas c, RecyclerView parent) {
    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
      final View child = parent.getChildAt(i);
      final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
      final int left = child.getLeft() - params.leftMargin;
      final int right = child.getRight() + params.rightMargin + lineWidth;
      final int top = child.getBottom() + params.bottomMargin;
      final int bottom = top + lineWidth;
      mDivider.setBounds(left, top, right, bottom);
      mDivider.draw(c);
    }
  }
  private void drawVertical(Canvas c, RecyclerView parent) {
    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
      final View child = parent.getChildAt(i);
      final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
      final int top = child.getTop() - params.topMargin;
      final int bottom = child.getBottom() + params.bottomMargin;
      final int left = child.getRight() + params.rightMargin;
      final int right = left + lineWidth;
      mDivider.setBounds(left, top, right, bottom);
      mDivider.draw(c);
    }
  }
  @Override
  public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    outRect.set(0, 0, lineWidth, lineWidth);
  }
}
RecyclerAdapter 어댑터,ui 와 연결

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
  private int item_layout;
  private List<String> mDataList;
  private List<Integer> mInts;
  private boolean isFirstSpecial;
  public RecyclerAdapter(int item_gridview, List<String> dataList, boolean isFisrtSpecial) {
    this(item_gridview, dataList);
    this.isFirstSpecial = isFisrtSpecial;
  }
  public RecyclerAdapter(int item_gridview, List<String> dataList) {
    this.item_layout = item_gridview;
    this.mDataList = dataList;
    mInts = Arrays.asList(R.mipmap.ic_launcher, R.mipmap.ic_launcher,
        R.mipmap.ic_launcher, R.mipmap.ic_launcher,
        R.mipmap.ic_launcher, R.mipmap.ic_launcher);
  }
  @Override
  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(item_layout, parent, false);
    return new ViewHolder(view);
  }
  @Override
  public void onBindViewHolder(ViewHolder holder, int position) {
    String str = mDataList.get(position);
    if (isFirstSpecial && position == 0) {
      holder.itemView.setBackgroundColor(Color.LTGRAY);
      holder.mTextView.setText("   ");
      holder.mImageView.setImageResource(R.mipmap.ic_launcher);
    } else {
      holder.itemView.setBackgroundColor(Color.WHITE);
      holder.mTextView.setText(str);
      holder.mImageView.setImageResource(mInts.get(position % mInts.size()));
    }
  }
  @Override
  public int getItemCount() {
    return mDataList == null ? 0 : mDataList.size();
  }
  public List<String> getDataList() {
    return mDataList;
  }
  class ViewHolder extends RecyclerView.ViewHolder {
    TextView mTextView;
    ImageView mImageView;
    public ViewHolder(View itemView) {
      super(itemView);
      mTextView = itemView.findViewById(R.id.tv_item);
      mImageView = itemView.findViewById(R.id.img_item);
    }
  }
}
OnRecyclerItemClickListener,이벤트 클릭.저 희 는 제스처 도구 류 Gesture Detector Compat 를 빌려 서 작 동 합 니 다.

public abstract class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener{
  private GestureDetectorCompat mGestureDetectorCompat;
  private RecyclerView mRecyclerView;
  public OnRecyclerItemClickListener(RecyclerView mRecyclerView) {
    this.mRecyclerView = mRecyclerView;
    mGestureDetectorCompat = new GestureDetectorCompat(mRecyclerView.getContext(),
        new ItemTouchHelperGestureListener());
  }
  @Override
  public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
    mGestureDetectorCompat.onTouchEvent(e);
    return false;
  }
  @Override
  public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    mGestureDetectorCompat.onTouchEvent(e);
  }
  @Override
  public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
  }
  //    
  public abstract void onItemClick(RecyclerView.ViewHolder viewHolder);
  public abstract void onLongClick(RecyclerView.ViewHolder viewHolder);
  private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
      View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
      if (childViewUnder != null) {
        RecyclerView.ViewHolder childViewHolder = mRecyclerView.getChildViewHolder(childViewUnder);
        onItemClick(childViewHolder);
      }
      return true;
    }
    @Override
    public void onLongPress(MotionEvent e) {
      View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
      if (childViewUnder != null) {
        RecyclerView.ViewHolder childViewHolder = mRecyclerView.getChildViewHolder(childViewUnder);
        onLongClick(childViewHolder);
      }
    }
  }
}
RecyItemTouchHelperCallback

public class RecyItemTouchHelperCallback extends ItemTouchHelper.Callback {
  RecyclerView.Adapter mAdapter;
  boolean isSwipeEnable;
  boolean isFirstDragUnable;
  public RecyItemTouchHelperCallback(RecyclerView.Adapter mAdapter) {
    this.mAdapter = mAdapter;
    isSwipeEnable = true;
    isFirstDragUnable = false;
  }
  public RecyItemTouchHelperCallback(RecyclerView.Adapter mAdapter, boolean isSwipeEnable, boolean isFirstDragUnable) {
    this.mAdapter = mAdapter;
    this.isSwipeEnable = isSwipeEnable;
    this.isFirstDragUnable = isFirstDragUnable;
  }
//    Touch     
  @Override
  public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {//      
      int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |
          ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
      int swipeFlags = 0;
      return makeMovementFlags(dragFlags, swipeFlags);
    } else {//list    
      int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
      int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
      return makeMovementFlags(dragFlags, swipeFlags);
    }
  }
  @Override
  public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    int fromPosition = viewHolder.getAdapterPosition();
    int toPosition = target.getAdapterPosition();
    if (isFirstDragUnable && toPosition == 0) {
      return false;
    }
    //      
    if (fromPosition < toPosition) {
      for (int i = fromPosition; i < toPosition; i++) {
        Collections.swap(((RecyclerAdapter) mAdapter).getDataList(), i, i + 1);
      }
    } else {
      for (int i = fromPosition; i > toPosition; i--) {
        Collections.swap(((RecyclerAdapter) mAdapter).getDataList(), i, i - 1);
      }
    }
    //  
    mAdapter.notifyItemMoved(fromPosition, toPosition);
    return true;
  }
  /**
   *            
   */
  @Override
  public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    int adapterPosition = viewHolder.getAdapterPosition();
    mAdapter.notifyItemRemoved(adapterPosition);
    ((RecyclerAdapter)mAdapter).getDataList().remove(adapterPosition);
  }
  @Override
  public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
    if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
      viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
    }
    super.onSelectedChanged(viewHolder, actionState);
  }
  @Override
  public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    super.clearView(recyclerView, viewHolder);
    viewHolder.itemView.setBackgroundColor(Color.WHITE);
  }
  @Override
  public boolean isLongPressDragEnabled() {
    return !isFirstDragUnable;
  }
  @Override
  public boolean isItemViewSwipeEnabled() {
    return isSwipeEnable;
  }
}
다음은 list 관련 설정 입 니 다.
마찬가지 로 listview 도 초기 화 설정 입 니 다.

public class ListViewActivity extends AppCompatActivity {
  RecyclerView mRecyclerView;
  List<String> mStringList;
  RecyclerAdapter mRecyAdapter;
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recyclerview);
    initView();
    initRecy();
  }
  private void initRecy() {
    if (mStringList == null) {
      mStringList = new ArrayList<>();
    }
    mStringList.addAll(DataManager.getData(15 - mStringList.size()));
    mRecyAdapter = new RecyclerAdapter(R.layout.item_listview, mStringList);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.addItemDecoration(new DividerListItemDecoration(this, LinearLayoutManager.VERTICAL));
    mRecyclerView.setHasFixedSize(true);
    RecyItemTouchHelperCallback itemTouchHelperCallback = new RecyItemTouchHelperCallback(mRecyAdapter);
    final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback);
    itemTouchHelper.attachToRecyclerView(mRecyclerView);
    mRecyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(mRecyclerView) {
      @Override
      public void onItemClick(RecyclerView.ViewHolder viewHolder) {
        RecyclerAdapter.ViewHolder viewHolder1 = (RecyclerAdapter.ViewHolder) viewHolder;
        String tvString = viewHolder1.mTextView.getText().toString();
        Toast.makeText(ListViewActivity.this, "     " + tvString, Toast.LENGTH_SHORT).show();
      }
      @Override
      public void onLongClick(RecyclerView.ViewHolder viewHolder) {
        Toast.makeText(ListViewActivity.this, "        !", Toast.LENGTH_SHORT).show();
      }
    });
    mRecyclerView.setAdapter(mRecyAdapter);
  }
  private void initView() {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    mRecyclerView = (RecyclerView) findViewById(R.id.view_recycler);
  }
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
      finish();
    }
    return super.onOptionsItemSelected(item);
  }
}
DividerListItemDecoration

public class DividerListItemDecoration extends RecyclerView.ItemDecoration {
  private static final int[] ATTRS = new int[] {android.R.attr.listDivider};
  public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
  public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
  private Drawable mDivider;
  private int mOrientation;
  public DividerListItemDecoration() {
    super();
  }
  public DividerListItemDecoration(Context context, int orientation) {
    final TypedArray array = context.obtainStyledAttributes(ATTRS);
    mDivider = array.getDrawable(0);
    array.recycle();
    this.mOrientation = orientation;
  }
  public DividerListItemDecoration(Context context, int orientation, int drawableId) {
    mDivider = ContextCompat.getDrawable(context, drawableId);
    setOrientation(orientation);
  }
  @Override
  public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
    super.onDraw(c, parent, state);
  }
  @Override
  public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    super.onDrawOver(c, parent, state);
  }
  @Override
  public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    if (mOrientation == VERTICAL_LIST) {
      outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
    } else {
      outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
    }
    super.getItemOffsets(outRect, view, parent, state);
  }
  public void setOrientation(int orientation) {
    if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
      throw new IllegalArgumentException("invalid orientaion");
    }
    mOrientation = orientation;
  }
}
원본 다운로드:http://download.csdn.net/download/loongago/9972876
총결산
위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 에서 RecyclerView 드래그,사 이 드 삭제 기능 의 실현 코드 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기