国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

recyclerview實現拖拽排序和側滑刪除

2019-11-09 18:02:29
字體:
來源:轉載
供稿:網友

Recyclerview現在基本已經替代Listview了,RecyclerView也越來越好用了  當我們有實現條目的拖拽排序和側滑刪除時  可以直接時候Recyclerview提供的API就可以直接實現了

先貼上主要代碼

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

步驟是

創建 ItemTouchHelper 對象時候,需要我們傳入一個實現了 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);}

實現 ItemTouchHelper.Callback 接口后有三個方法需要重寫:

getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) :設置滑動類型的標記。需要設置兩種類型的 flag ,即 dragFlags 和 swipeFlags ,分別代表著拖拽標記和滑動標記。最后需要調用 makeMovementFlags(dragFlags, swipeFlags)方法來合成返回。

onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) :當用戶拖拽列表某個 item 時會回調。很明顯,拖拽排序的代碼應該在這個方法中實現。

onSwiped(RecyclerView.ViewHolder viewHolder, int direction) :當用戶滑動列表某個 item 時會回調。所以側滑刪除的代碼應該在這個方法中實現。

下面是重寫的幾個方法:

第一個,getMovementFlags方法

@Overridepublic 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);}這個方法里面根據LayoutManager分了兩種情況,根據自己的情況去分

在GridLayoutManager中只能上下左右拖拽但是不能側滑刪除,所以swipFlag = 0;swipeFlag的值ItemTouchHelper.END是右滑刪除,ItemTouchHelper.START是左滑刪除

最后調用makeMovementFlags方法合成返回

第二個方法,onMove方法

@Overridepublic 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 的時候調用。所以關于列表排序的代碼應該寫在這里。方法參數中的 viewHolder 代表的是用戶當前拖拽的 item ,而 target 代表的是被用戶拖拽所覆蓋的那個 item 。所以在 onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) 方法中的邏輯就是把 fromPosition 至 toPosition 為止改變它們的位置。

第三個方法,onSwiped方法

@Overridepublic 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);    }}這個方法是在用戶側滑的時候調用的 ,在里面對adapter的數據進行刪除就可以了

最后兩個方法

 @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);    }}就是優化的方法,第一個是選擇條目改變狀態,第二個是手指抬起之后恢復條目狀態


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洛川县| 金湖县| 伊春市| 潞城市| 涡阳县| 怀仁县| 嵩明县| 海淀区| 尚义县| 龙陵县| 惠水县| 汉寿县| 新丰县| 襄城县| 克东县| 霍林郭勒市| 林周县| 越西县| 遂川县| 道真| 独山县| 阳原县| 屯留县| 吉林市| 榆社县| 霍山县| 舟山市| 当涂县| 乐安县| 康平县| 浑源县| 塔城市| 昌都县| 瑞昌市| 根河市| 商水县| 平塘县| 伊吾县| 托克逊县| 茌平县| 星子县|