2017-01-12 遇到的一點小問題
看自定義Behavior相關的文章時蓉冈,還沒看明白呢长豁,看到ItemTouchHelper這個詞甩卓,表示第一次見,搜了一下蕉斜,好像很好用逾柿,不用自定義View就能讓ItemTouchHelper實現(xiàn)拖拽排序和滑動刪除之類的功能。而且簡單多了宅此,先試試這個机错。
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0630/3123.html
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0724/3219.html
這兩個寫得很詳細,而且有demo父腕,下載來看看就能大概明白基本的用法了弱匪。這邊記錄一下主要步驟,方便以后使用。
主要的就是寫一個類extends繼承android.support.v7.widget.helperItemTouchHelper.Callback
然后會提示重寫幾個方法
public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
return 0;
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
}
getMovementFlags()
這個方法是用來設置支持操作的方向萧诫,按源碼寫的斥难,return makeMovementFlags(int dragFlags, int swipeFlags)
來區(qū)分拖拽或滑動往某個方向時可觸發(fā)操作。比如帘饶,如果只能往右滑動才有反應就可以final int swipeFlags = ItemTouchHelper.END;
關閉這項功能則可以直接=0哑诊。
onMove()
是拖拽完成時,在這邊通知適配器改變及刻。
onSwiped()
是滑動完成時镀裤,在這邊通知適配器改變。
為了讓適配器及時收到通知缴饭,自定義一個接口暑劝,這樣我們的Adapter就能implements ItemTouchHelperAdapter
來更新數(shù)據(jù)
public interface ItemTouchHelperAdapter {
boolean onItemMove(int fromPosition, int toPosition);
void onItemDismiss(int position);
}
再在自定義的MyItemTouchHelperCallback
寫一個帶ItemTouchHelperAdapter
的構造方法。
public MyItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
mAdapter = adapter;
}
在Activity里創(chuàng)建ItemTouchHelper
并綁定RecyclerView
颗搂,這樣最基本的就沒問題了担猛。
ItemTouchHelper.Callback callback = new MyItemTouchHelperCallback(mAdapter);
ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(callback);
mItemTouchHelper.attachToRecyclerView(mRecycler);
默認長按item可時可進入拖拽準備狀態(tài),因為isLongPressDragEnabled()
這個方法默認return true
丢氢;item任意位置也能滑動傅联,因為isItemViewSwipeEnabled()
默認return true
。
如果只是要在指定地方可操作卖丸,就按demo的來纺且。先將剛才那兩個方法改成return false
盏道,然后將Adapter的某個View.setOnTouchListener
在
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN)
狀態(tài)時稍浆,通知Activity里的ItemTouchHelper
執(zhí)行.startDrag(viewHolder)
和.startSwipe(viewHolder)
方法。
holder.btn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
mDragStartListener.onStartDrag(holder);
}
return false;
}
});
RecyclerView mRecycler = (RecyclerView) findViewById(R.id.recycler);
mRecycler.setLayoutManager(new LinearLayoutManager(context));
AdapteRecycler mAdapter = new AdapteRecycler(new OnStartDragListener() {
@Override
public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
mItemTouchHelper.startDrag(viewHolder);
mItemTouchHelper.startSwipe(viewHolder);
}
});
mRecycler.setAdapter(mAdapter);
mItemTouchHelper = new ItemTouchHelper(new MyItemTouchHelperCallback(mAdapter));
mItemTouchHelper.attachToRecyclerView(mRecycler);
demo里還有些細節(jié)猜嘱,就是在自定義的ItemTouchHelper.Callback
里面重寫一些相應的方法來改變item的樣式衅枫。
onSelectedChanged
選中時;clearView
操作結束朗伶;或者重寫onChildDraw
弦撩,根據(jù)坐標變換來及時繪制View。
以上都是看的 泡在網(wǎng)上的日子 那兩篇博客和demo(https://github.com/iPaulPro/Android-ItemTouchHelper-Demo/releases)的記錄论皆,因為項目里還不用益楼,所以不知道實際操作中會不會有問題。等有用到再更新点晴。
list替換用的java.util.Collections
的public static void swap(List<?> list,int i,int j)
感凤,好像都沒用過,記一下粒督,下次才知道陪竿。
接著看一下這個自定義Behavior相關(http://www.reibang.com/p/f7989a2a3ec2 )。