material design(三)recycleview的ItemTouchHelper

前言:

上一篇文章,material design(二)RecycleView的使用詳解,簡單介紹了recycleview的使用,並且實現了item的點擊和長按事件效果。Android提供了一個ItemTouchHelper類,顧名思義,這完全就是爲了服務item的類。下面我們來通過這個類來實現item的滑動刪除和拖拽實現位置交換的效果。

使用:

1 繼承ItemTouchHelper.Callback

public class RecycleItemTouchHelper extends ItemTouchHelper.Callback {

    private ListViewAdapter mAdapter;

    public RecycleItemTouchHelper(ListViewAdapter madapter) {

        this.mAdapter=madapter;
    }

    /**
     * 設置滑動類型標記
     * @param recyclerView
     * @param viewHolder
     * @return 返回一個整數類型的標識,用於判斷Item那種移動行爲是允許的
     */
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        /**
         * START  右向左
         * END  左向右
         * LEFT  向左
         * RIGHT 向右
         * UP  向上
         * 如果某個值傳0,表示不觸發該操作,次數設置支持上下拖拽,支持向右滑動
         */

        return makeMovementFlags(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.END|ItemTouchHelper.START);
    }

    /**
     * 拖拽切換item的回調
     * @param recyclerView
     * @param viewHolder
     * @param target
     * @return true切換了拖拽  false 沒有切換
     */
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        mAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
        return true;
    }

    /**
     * 滑動的回調
     * @param viewHolder
     * @param direction
     */
    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

      mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
    }

    /**
     * 是否支持長按拖拽
     * @return
     */
    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    /**
     * item是否支持滑動
     * @return
     */
    @Override
    public boolean isItemViewSwipeEnabled() {
        return true;
    }

    /**
     * 恢復到原狀態,沒有消失
     * @param recyclerView
     * @param viewHolder
     */
    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);
        Log.i("sssssssss1","11111");
    }

    /**
     *
     * @param viewHolder
     * @param actionState 0正在側滑 1釋放
     */
    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        super.onSelectedChanged(viewHolder, actionState);
        Log.i("sssssssss2","22222"+actionState);
        if (actionState!= ItemTouchHelper.ACTION_STATE_IDLE){
            viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
        }
    }

    /**
     * item滑動
     * @param c
     * @param recyclerView
     * @param viewHolder
     * @param dX
     * @param dY
     * @param actionState
     * @param isCurrentlyActive
     */
    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
        Log.i("sssssssss3","3333"+isCurrentlyActive);
    }

    /**
     * 滑動停止
     * @param c
     * @param recyclerView
     * @param viewHolder
     * @param dX
     * @param dY
     * @param actionState
     * @param isCurrentlyActive
     */
    @Override
    public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
        Log.i("sssssssss4","4444"+dY);
    }
}
代碼還是比較簡單的,首先傳一個adapter進來,主要是爲了回調事件。
getMovementFlags  滑動類型標記

onMove 拖拽交換事件

onSwiped 滑動刪除事件

其他事件也都有註釋,可以看看自己點擊看看log日誌。

***2***  adapter
public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.ViewHolder> implements ItemTouchHelperAdapter {

    private Context mContext;
    private List<ListBean> mData=new ArrayList<>();
    private LayoutInflater inflater;

    public List<ListBean> getData() {
        return mData;
    }

    public void setData(List<ListBean> data) {
        mData = data;
        notifyDataSetChanged();
    }

    public void addData(List<ListBean> data){
        mData.addAll(data);
        notifyDataSetChanged();
    }

    /**
     * 複用item佈局
     * @param parent Recycleview
     * @param viewType type類型
     * @return 內部類viewhodler對象
     */

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(mContext==null){
            mContext=parent.getContext();
            inflater=LayoutInflater.from(mContext);
        }
        View view= inflater.inflate(R.layout.listview_item,parent,false);
        Log.i("sssss1",parent.toString()+"    "+viewType);
        return new ListViewAdapter.ViewHolder(view);
    }

    /**
     *
     * @param holder onCreateViewHolder返回的holder
     * @param position 位置
     */
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        Log.i("sssss2",holder.toString()+"    "+position);
        ListBean bean=mData.get(position);
        holder.mTextView.setText(bean.getName());
//        holder.mTextView.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                addData(position);
//            }
//        });
//        holder.mTextView.setOnLongClickListener(new View.OnLongClickListener() {
//            @Override
//            public boolean onLongClick(View v) {
//                removeData(position);
//                return false;
//            }
//        });

    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        Collections.swap(mData, fromPosition, toPosition);
        notifyItemMoved(fromPosition, toPosition);
    }

    @Override
    public void onItemDismiss(int position) {
        mData.remove(position);
        notifyItemRemoved(position);
    }

    /**
     * ViewHolder的內部類,View爲item的佈局,其他小的控件
     * 可以findviewbyid獲得,這個view就是textview
     */
    static class ViewHolder extends RecyclerView.ViewHolder{
        private TextView mTextView;
        public ViewHolder(View itemView) {
            super(itemView);
            mTextView= (TextView) itemView.findViewById(R.id.tv_item);
        }
    }
    public void addData(int position) {
        mData.add(position, new ListBean("Insert One"));
        notifyItemInserted(position);
    }

    public void removeData(int position) {
        mData.remove(position);
        notifyItemRemoved(position);
    }
}

主要是事件的監聽,同時要主要數據更新通知調用的方法,這樣纔有動畫。

3 監聽接口 ItemTouchHelperAdapter

public interface ItemTouchHelperAdapter {

    //交換
    void onItemMove(int fromPosition, int toPosition);

    //滑動刪除
    void onItemDismiss(int position);

}

4 activity

 //-------------item---------------------------
        ItemTouchHelper.Callback helper=new RecycleItemTouchHelper(mListViewAdapter);
        ItemTouchHelper touchHelper=new ItemTouchHelper(helper);
        touchHelper.attachToRecyclerView(mRecyclerView);

設置callback到recycleview中,這樣就能實現item的數據交換和滑動刪除了,是不是很簡單。歡迎留言交流。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章