欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android recyclerview實現(xiàn)拖拽排序和側(cè)滑刪除

 更新時間:2017年02月20日 11:59:46   作者:天安門前掃地僧  
這篇文章主要為大家詳細(xì)介紹了Android recyclerview實現(xiàn)拖拽排序和側(cè)滑刪除,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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 對象時候,需要我們傳入一個實現(xiàn)了 ItemTouchHelper.Callback 接口的對象。而排序和刪除的邏輯都封裝在了這個 ItemTouchHelper.Callback 的對象里面了。

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

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

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

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

第一個,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);
}

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

第二個,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;
}

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

第三個,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);
  }
}

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

最后兩個方法

 @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)化的方法,第一個是選擇條目改變狀態(tài),第二個是手指抬起之后恢復(fù)條目狀態(tài)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論