使用ItemTouchHelper仿網(wǎng)易新聞 頻道拖拽

先看效果圖


demo下載 項目架構(gòu)為TheMVP

  1. 使用ItemTouchHelper 必須自己實現(xiàn) ItemTouchHelper.Callback 類
public class ItemDragHelperCallback extends ItemTouchHelper.Callback{
  1. 實現(xiàn)ItemTouchHelper.Callback類中接口方法getMovementFlags()確定方向
/**
     * 指定需要拖拽的方向
     *
     * @param recyclerView
     * @param viewHolder
     * @return
     */
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        int dragFlags;//拖拽方向
        int swipeFlags;//滑動方向
        //針對第一個不能拖拽
        if (viewHolder.getAdapterPosition() == 0) {
            return 0;
        }
        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) {
            dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT | ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        } else {
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        }
        swipeFlags = 0;
        return makeMovementFlags(dragFlags, swipeFlags);
    }
  1. 實現(xiàn)ItemTouchHelper.Callback的onMove()和onSwiped()方法
//拖拽功能在這里實現(xiàn)
 @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        //不同類型的item 不能拖拽
        if (viewHolder.getItemViewType() != target.getItemViewType()) {
            return false;
        }
        //如果目標點為第一個 也不能拖拽過去
        if(target.getAdapterPosition()==0){
            return false;
        }
        if (recyclerView.getAdapter() instanceof OnItemMoveListener) {
            //這里定義一個借口有Adapter實現(xiàn) 然后針對數(shù)據(jù)的變動交由Adapter去具體實現(xiàn)
            OnItemMoveListener listener = (OnItemMoveListener) recyclerView.getAdapter();
            listener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        }
        return false;
    }
    /**
      *滑動刪除的方法在這里實現(xiàn)(本demo沒有該功能)
      */
    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {}
  1. 對應的Adapter接口
public interface OnItemMoveListener {
    void onItemMove(int fromPosition, int toPosition);//item拖拽的起始位置
    void onItemDismiss(int position);//滑動刪除的item
}
public class NewsLabelAdapter extends RecyclerView.Adapter<NewsLabelAdapter.ViewHolder> implements OnItemMoveListener {
/**
     * 拖拽交換
     *
     * @param fromPosition
     * @param toPosition
     * @return
     */
    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        Collections.swap(labels, fromPosition, toPosition);
        notifyItemMoved(fromPosition, toPosition);
    }
    /**
     * 滑動刪除
     *
     * @param position
     */
    @Override
    public void onItemDismiss(int position) {

    }
}
  1. ItemTouchHelper.CallbackisItemViewSwipeEnabled()isLongPressDragEnabled() 所對應的功能為滑動 和拖拽 根據(jù)需求是否開啟
@Override
    public boolean isItemViewSwipeEnabled() {
        // 不需要滑動功能
        return false;
    }

    @Override
    public boolean isLongPressDragEnabled() {
        // 長按拖拽功能
        return true;
    }
  1. 最后 我們可以創(chuàng)建自己的ItemTouchHelper實例并調(diào)用attachToRecyclerView(RecyclerView)方法 就能實現(xiàn)該功能了
ItemDragHelperCallback callback=new ItemDragHelperCallback(); 
ItemTouchHelper helper=new ItemTouchHelper(callback);
itemHelper.attachToRecyclerView(top_recyclerView);
  1. 開過程中遇到的坑
  • RecyclerView的item只能顯示一列由參數(shù)parent造成 在inflate(R.layout.item_label, null, false)中第二個參數(shù)不能傳parent 換為null就好了

//在inflate(R.layout.item_label, null, false)中第二個參數(shù)不能傳parent 換為null就好了
@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_label, null, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}

 - 在添加或者刪除item數(shù)據(jù)時 造成集合數(shù)據(jù)position混亂是由 notifyItemRemoved(position);造成的 在后面再調(diào)用notifyItemRangeChanged(0,labels.size());就好了
  ```
if (position != 0 && isEditMode && onDeleteData != null) {
                  String tag = labels.remove(position);
                  if (!tag.isEmpty()) {
                      onDeleteData.onDelete(tag);
                      //更新視圖
                      notifyItemRemoved(position);
                      notifyItemRangeChanged(0,labels.size());
                  }
              }
  ```
  

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子驯鳖,更是在濱河造成了極大的恐慌敲长,老刑警劉巖荞下,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機刷钢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乳附,“玉大人内地,你說我怎么就攤上這事「吵” “怎么了阱缓?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長举农。 經(jīng)常有香客問我荆针,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任航背,我火速辦了婚禮秸妥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沃粗。我一直安慰自己,他們只是感情好键畴,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布最盅。 她就那樣靜靜地躺著,像睡著了一般起惕。 火紅的嫁衣襯著肌膚如雪涡贱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天惹想,我揣著相機與錄音问词,去河邊找鬼。 笑死嘀粱,一個胖子當著我的面吹牛激挪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锋叨,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼垄分,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了娃磺?” 一聲冷哼從身側(cè)響起薄湿,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎偷卧,沒想到半個月后豺瘤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡听诸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年坐求,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛇更。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞻赶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出派任,到底是詐尸還是另有隱情砸逊,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布掌逛,位于F島的核電站师逸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏豆混。R本人自食惡果不足惜篓像,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一动知、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧员辩,春花似錦盒粮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宋税,卻和暖如春摊崭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杰赛。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工呢簸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乏屯。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓根时,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辰晕。 傳聞我的和親對象是個殘疾皇子啸箫,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容