Androidrecyclerview實(shí)現(xiàn)拖拽排序和側(cè)滑刪除

Recyclerview現(xiàn)在基本已經(jīng)替代Listview了,RecyclerView也越來(lái)越好用了  當(dāng)我們有實(shí)現(xiàn)條目的拖拽排序和側(cè)滑刪除時(shí)  可以直接時(shí)候Recyclerview提供的API就可以直接實(shí)現(xiàn)了
先貼上主要代碼

創(chuàng)新互聯(lián)公司主營(yíng)烏恰網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App制作,烏恰h5小程序設(shè)計(jì)搭建,烏恰網(wǎng)站營(yíng)銷推廣歡迎烏恰等地區(qū)企業(yè)咨詢

private void initveiw() {
  ArrayList<String> items = new ArrayList<>(Arrays.asList("itme1", "item2", "itme3", "item4", "item5", "item6", "item7", "item8", "itme9", "item10", "itme11", "item12", "item13", "item14", "item15", "item16"));
  recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
  SimpleAdapter adapter = new SimpleAdapter(items);
  recyclerView.setAdapter(adapter);
  ItemTouchHelper helper = new ItemTouchHelper(new MyItemTouchCallback(adapter));
  helper.attachToRecyclerView(recyclerView);
}

public class MyItemTouchCallback extends ItemTouchHelper.Callback{

  private SimpleAdapter adapter;

  public MyItemTouchCallback(SimpleAdapter adapter) {
    this.adapter = adapter;
  }

  @Override
  public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    int dragFlag;
    int swipeFlag;
    RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
    if (manager instanceof GridLayoutManager){
      dragFlag = ItemTouchHelper.DOWN | ItemTouchHelper.UP | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
      swipeFlag = 0;
    }else{
      dragFlag = ItemTouchHelper.DOWN | ItemTouchHelper.UP;
      swipeFlag = ItemTouchHelper.END | ItemTouchHelper.START;
    }

    return makeMovementFlags(dragFlag,swipeFlag);
  }

  @Override
  public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    int fromPosition = viewHolder.getAdapterPosition();
    int toPosition = target.getAdapterPosition();
    if (fromPosition < toPosition ){
      for (int i = fromPosition ;i<toPosition ;i++){
        Collections.swap(adapter.getDataList(),i,i+1);
      }
    }else{
      for (int i= fromPosition; i>toPosition; i--){
        Collections.swap(adapter.getDataList(),i ,i-1);
      }
    }
    recyclerView.getAdapter().notifyItemMoved(fromPosition,toPosition);
    return true;
  }

  @Override
  public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    int position = viewHolder.getAdapterPosition();
    if (direction == ItemTouchHelper.END | direction==ItemTouchHelper.START){
      adapter.getDataList().remove(position);
      adapter.notifyItemRemoved(position);
    }
  }

  @Override
  public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
    super.onSelectedChanged(viewHolder, actionState);
    if (actionState==ItemTouchHelper.ACTION_STATE_DRAG){
      viewHolder.itemView.setBackgroundColor(Color.BLUE);
    }

  }

  @Override
  public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    super.clearView(recyclerView, viewHolder);
    viewHolder.itemView.setBackgroundColor(0);
  }
}

步驟:

創(chuàng)建 ItemTouchHelper 對(duì)象時(shí)候,需要我們傳入一個(gè)實(shí)現(xiàn)了 ItemTouchHelper.Callback 接口的對(duì)象。而排序和刪除的邏輯都封裝在了這個(gè) ItemTouchHelper.Callback 的對(duì)象里面了。

private void initveiw() {
  ArrayList<String> items = new ArrayList<>(Arrays.asList("itme1", "item2", "itme3", "item4", "item5", "item6", "item7", "item8", "itme9", "item10", "itme11", "item12", "item13", "item14", "item15", "item16"));
  recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
  SimpleAdapter adapter = new SimpleAdapter(items);
  recyclerView.setAdapter(adapter);
  ItemTouchHelper helper = new ItemTouchHelper(new MyItemTouchCallback(adapter));
  helper.attachToRecyclerView(recyclerView);
}

 實(shí)現(xiàn)ItemTouchHelper.Callback接口后有三個(gè)方法需要重寫(xiě):

getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) :設(shè)置滑動(dòng)類型的標(biāo)記。需要設(shè)置兩種類型的 flag ,即 dragFlags 和 swipeFlags ,分別代表著拖拽標(biāo)記和滑動(dòng)標(biāo)記。最后需要調(diào)用 makeMovementFlags(dragFlags,
 swipeFlags)方法來(lái)合成返回。
onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) :當(dāng)用戶拖拽列表某個(gè) item 時(shí)會(huì)回調(diào)。很明顯,拖拽排序的代碼應(yīng)該在這個(gè)方法中實(shí)現(xiàn)。

onSwiped(RecyclerView.ViewHolder viewHolder, int direction) :當(dāng)用戶滑動(dòng)列表某個(gè) item 時(shí)會(huì)回調(diào)。所以側(cè)滑刪除的代碼應(yīng)該在這個(gè)方法中實(shí)現(xiàn)。
下面是重寫(xiě)的幾個(gè)方法:

第一個(gè),getMovementFlags方法

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
  int dragFlag;
  int swipeFlag;
  RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
  if (manager instanceof GridLayoutManager){
    dragFlag = ItemTouchHelper.DOWN | ItemTouchHelper.UP | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
    swipeFlag = 0;
  }else{
    dragFlag = ItemTouchHelper.DOWN | ItemTouchHelper.UP;
    swipeFlag = ItemTouchHelper.END | ItemTouchHelper.START;
  }

  return makeMovementFlags(dragFlag,swipeFlag);
}

這個(gè)方法里面根據(jù)LayoutManager分了兩種情況,根據(jù)自己的情況去分
在GridLayoutManager中只能上下左右拖拽但是不能側(cè)滑刪除,所以swipFlag = 0;swipeFlag的值ItemTouchHelper.END是右滑刪除,ItemTouchHelper.START是左滑刪除
最后調(diào)用makeMovementFlags方法合成返回

第二個(gè),onMove方法

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
  int fromPosition = viewHolder.getAdapterPosition();
  int toPosition = target.getAdapterPosition();
  if (fromPosition < toPosition ){
    for (int i = fromPosition ;i<toPosition ;i++){
      Collections.swap(adapter.getDataList(),i,i+1);
    }
  }else{
    for (int i= fromPosition; i>toPosition; i--){
      Collections.swap(adapter.getDataList(),i ,i-1);
    }
  }
  recyclerView.getAdapter().notifyItemMoved(fromPosition,toPosition);
  return true;
}

這個(gè)方法是用戶在拖拽 item 的時(shí)候調(diào)用。所以關(guān)于列表排序的代碼應(yīng)該寫(xiě)在這里。方法參數(shù)中的 viewHolder 代表的是用戶當(dāng)前拖拽的 item ,而 target 代表的是被用戶拖拽所覆蓋的那個(gè) item 。所以在 onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) 方法中的邏輯就是把 fromPosition 至 toPosition 為止改變它們的位置。

第三個(gè),onSwiped方法

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
  int position = viewHolder.getAdapterPosition();
  if (direction == ItemTouchHelper.END | direction==ItemTouchHelper.START){
    adapter.getDataList().remove(position);
    adapter.notifyItemRemoved(position);
  }
}

這個(gè)方法是在用戶側(cè)滑的時(shí)候調(diào)用的 ,在里面對(duì)adapter的數(shù)據(jù)進(jìn)行刪除就可以了

最后兩個(gè)方法

 @Override
  public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
    super.onSelectedChanged(viewHolder, actionState);
    if (actionState==ItemTouchHelper.ACTION_STATE_DRAG){
      viewHolder.itemView.setBackgroundColor(Color.BLUE);
    }

  }

  @Override
  public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    super.clearView(recyclerView, viewHolder);
    viewHolder.itemView.setBackgroundColor(0);
  }
}

就是優(yōu)化的方法,第一個(gè)是選擇條目改變狀態(tài),第二個(gè)是手指抬起之后恢復(fù)條目狀態(tài)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

文章名稱:Androidrecyclerview實(shí)現(xiàn)拖拽排序和側(cè)滑刪除
文章分享:http://bm7419.com/article18/gocggp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、搜索引擎優(yōu)化、微信公眾號(hào)標(biāo)簽優(yōu)化、企業(yè)建站、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)