Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用TouchHelperCallback部分和完全刷取Recyclerview_Android_Android Recyclerview - Fatal编程技术网

Android 使用TouchHelperCallback部分和完全刷取Recyclerview

Android 使用TouchHelperCallback部分和完全刷取Recyclerview,android,android-recyclerview,Android,Android Recyclerview,我正在尝试使用api TouchHelperCallback实现对Recyclerview的部分和完全扫描,这是一组库,如和,但如何使用api实现这一点 我能用下面的代码实现全刷,请任何人就如何解决这个问题提出建议 谢谢 代码库: ExtendedItemTouchHelperCallback: import android.graphics.Canvas; import android.support.v7.widget.RecyclerView; import android.support

我正在尝试使用api TouchHelperCallback实现对Recyclerview的部分和完全扫描,这是一组库,如和,但如何使用api实现这一点

我能用下面的代码实现全刷,请任何人就如何解决这个问题提出建议

谢谢

代码库:

ExtendedItemTouchHelperCallback:

import android.graphics.Canvas;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;


public abstract class ExtendItemTouchHelperCallback extends ItemTouchHelper.Callback
{

    private int mCachedMaxScrollSpeed = -1; // default
    private static final long DRAG_SCROLL_ACCELERATION_LIMIT_TIME_MS = 2000; // default

    @Override
    public abstract int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder);

    @Override
    public abstract boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder viewHolder1);

    @Override
    public abstract void onSwiped(RecyclerView.ViewHolder viewHolder, int i);


    @Override
    public abstract void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder);

    @Override
    public abstract void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState);

    @Override
    public abstract void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive);

    @Override
    public abstract void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive);


    // default
    @Override
    public int interpolateOutOfBoundsScroll(RecyclerView recyclerView, int viewSize, int viewSizeOutOfBounds, int totalSize, long msSinceStartScroll)
    {
//        return super.interpolateOutOfBoundsScroll(recyclerView, viewSize, viewSizeOutOfBounds, totalSize, msSinceStartScroll);
        final int maxScroll = Util.getMaxDragScroll(recyclerView);
        final int absOutOfBounds = Math.abs(viewSizeOutOfBounds);
        final int direction = (int) Math.signum(viewSizeOutOfBounds);
        // might be negative if other direction
        float outOfBoundsRatio = Math.min(1f, 1f * absOutOfBounds / viewSize);
        final int cappedScroll = (int) (direction * maxScroll *
                Util.sDragViewScrollCapInterpolator.getInterpolation(outOfBoundsRatio));
        final float timeRatio;
        if (msSinceStartScroll > DRAG_SCROLL_ACCELERATION_LIMIT_TIME_MS)
        {
            timeRatio = 1f;
//            timeRatio = 3f;
        }
        else
        {
            timeRatio = (float) msSinceStartScroll / DRAG_SCROLL_ACCELERATION_LIMIT_TIME_MS;
        }
        final int value = (int) (cappedScroll * Util.sDragScrollInterpolator.getInterpolation(timeRatio));
        if (value == 0)
        {
            return viewSizeOutOfBounds > 0 ? 1 : -1;
        }
        return value;
    }


}
Util:

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="80dp"
    >


    <LinearLayout
        android:id="@+id/list_item_facade_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white"
        android:gravity="center_vertical"
        android:minHeight="?android:attr/listPreferredItemHeight"
        android:orientation="vertical"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:paddingTop="8dp">


        <TextView
            android:id="@+id/list_item_main_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Main text"
            android:textColor="@android:color/black"/>


        <TextView
            android:id="@+id/list_item_sub_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="sub text"
            android:textColor="@android:color/black"/>


    </LinearLayout>

    <RelativeLayout
        android:id="@+id/list_item_rear_right_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_red_dark"
        android:visibility="invisible">

        <Button
            android:id="@android:id/button1"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="16dp"
            android:background="@drawable/ic_launcher"
            android:gravity="center"/>

    </RelativeLayout>


    <RelativeLayout
        android:id="@+id/list_item_rear_left_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_green_dark"
        android:visibility="invisible">

        <Button
            android:id="@android:id/button1"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="16dp"
            android:background="@drawable/ic_action_remove"
            android:gravity="center"/>

    </RelativeLayout>

</RelativeLayout>

并在活动中实现回调

private ItemTouchHelper.Callback crateCallback()
    {
        return new ExtendItemTouchHelperCallback()
        {
            @Override
            public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
            {

                if (viewHolder instanceof ItemAdapter.ViewHolder)
                {

                    //this make sure that the value works for the drag and drop too
                    //return makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT) | makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP | ItemTouchHelper.DOWN);
                    return makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT);

                }
                return 0;
            }

            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
            {
                final int fromPos = viewHolder.getAdapterPosition();
                final int toPos = target.getAdapterPosition();
                Log.d(LOG_TAG, " postion " + "From: " + fromPos + " TO: " + toPos);
                mItemAdapter.move(fromPos, toPos);
                return true;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int i)
            {
                int removedId = mItemAdapter.remove(viewHolder.getAdapterPosition());

               // Snackbar.make(mRecyclerView, "Item removed, position: " + removedId, Snackbar.LENGTH_SHORT).show();


                //ExtendAsyncQueryHandler extendAsyncQueryHandler = new ExtendAsyncQueryHandler(getActivity().getContentResolver());
                //extendAsyncQueryHandler.startDelete(removedId, null, DataContract.ItemEntry.buildItemUri(removedId), null, null);

                Log.d(LOG_TAG, "removed row; " + removedId);
            }

            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
            {
                getDefaultUIUtil().clearView(((ItemAdapter.ViewHolder) viewHolder).mFacadeLayout);
//                getDefaultUIUtil().clearView(((ItemAdapter.ViewHolder) viewHolder).itemView);//                ((ItemAdapter.ViewHolder) viewHolder).setLayoutVisibility(false);
                ((ItemAdapter.ViewHolder) viewHolder).setLayoutVisibility(ItemAdapter.SWIPE_END);
            }

            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)
            {
                if (viewHolder != null) {
                    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
                        getDefaultUIUtil().onSelected(((ItemAdapter.ViewHolder) viewHolder).mFacadeLayout);
//                        ((ItemAdapter.ViewHolder) viewHolder).setLayoutVisibility(true);
                    } else if (actionState == ItemTouchHelper.ACTION_STATE_IDLE) {

                        getDefaultUIUtil().onSelected(((ItemAdapter.ViewHolder) viewHolder).itemView);
                    } else {
                        getDefaultUIUtil().onSelected(((ItemAdapter.ViewHolder) viewHolder).itemView);
                    }


                }
            }

            @Override
            public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive)
            {
                Log.d(LOG_TAG, "dx: " + dX + " dy: " + dY);



                if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {

                    float swipingDx = dX;
                    String swipingDirection;
                    if (swipingDx > 0) {
                        swipingDirection = ItemAdapter.SWIPING_RIGHT;
                    } else if (swipingDx < 0) {
                        swipingDirection = ItemAdapter.SWIPING_LEFT;
                    } else {
                        swipingDirection = ItemAdapter.SWIPE_END;
                    }
//                    String swipingDirection = swipingDx > 0 ? ItemAdapter.SWIPING_RIGHT :ItemAdapter.SWIPING_LEFT;

                    getDefaultUIUtil().onDraw(c, recyclerView,
                            ((ItemAdapter.ViewHolder) viewHolder).mFacadeLayout, dX, dY,
                            actionState, isCurrentlyActive);
                    ((ItemAdapter.ViewHolder) viewHolder).setLayoutVisibility(swipingDirection);

                } else {
                    getDefaultUIUtil().onDraw(c, recyclerView,
                            ((ItemAdapter.ViewHolder) viewHolder).itemView, dX, dY,
                            actionState, isCurrentlyActive);

                }
            }

            @Override
            public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive)
            {
                if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
                    getDefaultUIUtil().onDrawOver(c, recyclerView,
                            ((ItemAdapter.ViewHolder) viewHolder).mFacadeLayout, dX, dY,
                            actionState, isCurrentlyActive);
                } else {
                    getDefaultUIUtil().onDraw(c, recyclerView,
                            ((ItemAdapter.ViewHolder) viewHolder).itemView, dX, dY,
                            actionState, isCurrentlyActive);
//                    ((ItemAdapter.ViewHolder) viewHolder).setLayoutVisibility(false);                }
                }


            }
        };

    }
private-ItemTouchHelper.Callback-Callback()
{
返回新的ExtendItemTouchHelperCallback()
{
@凌驾
public int getMovementFlags(RecyclerView RecyclerView,RecyclerView.ViewHolder ViewHolder)
{
if(ItemAdapter.viewHolder的viewHolder实例)
{
//这样可以确保该值也适用于拖放
//返回makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE,ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT)| makeFlag(ItemTouchHelper.ACTION_STATE_拖动,ItemTouchHelper.UP | ItemTouchHelper.DOWN);
返回makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE,ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT);
}
返回0;
}
@凌驾
公共布尔onMove(RecyclerView RecyclerView、RecyclerView.ViewHolder ViewHolder、RecyclerView.ViewHolder目标)
{
final int fromPos=viewHolder.getAdapterPosition();
final int toPos=target.getAdapterPosition();
Log.d(Log_标签,“position”+”从:“+fromPos+”到:“+toPos”);
移动(从位置、地形);
返回true;
}
@凌驾
公共空间(RecyclerView.ViewHolder ViewHolder,int i)
{
int removedId=mItemAdapter.remove(viewHolder.getAdapterPosition());
//Snackbar.make(mRecyclerView,“项目移除,位置:”+removedId,Snackbar.LENGTH_SHORT).show();
//ExtendAsyncQueryHandler ExtendAsyncQueryHandler=新的ExtendAsyncQueryHandler(getActivity().getContentResolver());
//startDelete(removedId,null,DataContract.ItemEntry.buildItemUri(removedId),null,null);
Log.d(Log_标签,“删除的行;”+removedId);
}
@凌驾
公共无效clearView(RecyclerView RecyclerView,RecyclerView.ViewHolder视图持有人)
{
getDefaultUIUtil().clearView(((ItemAdapter.ViewHolder)ViewHolder).mFacadeLayout);
//getDefaultUIUtil().clearView(((ItemAdapter.ViewHolder)ViewHolder.itemView);/((ItemAdapter.ViewHolder)ViewHolder.setLayoutVisibility(false);
((ItemAdapter.ViewHolder)ViewHolder).setLayoutVisibility(ItemAdapter.SWIPE_END);
}
@凌驾
选择更改后的公共无效(RecyclerView.ViewHolder ViewHolder,int actionState)
{
if(viewHolder!=null){
如果(actionState==ItemTouchHelper.ACTION\u STATE\u SWIPE){
getDefaultUIUtil().onSelected(((ItemAdapter.ViewHolder)ViewHolder).mFacadeLayout);
//((ItemAdapter.ViewHolder)ViewHolder).setLayoutVisibility(true);
}else if(actionState==ItemTouchHelper.ACTION\u STATE\u IDLE){
getDefaultUIUtil().onSelected(((ItemAdapter.ViewHolder)ViewHolder).itemView);
}否则{
getDefaultUIUtil().onSelected(((ItemAdapter.ViewHolder)ViewHolder).itemView);
}
}
}
@凌驾
public void onChildraw(画布c、RecyclerView RecyclerView、RecyclerView.ViewHolder ViewHolder、float dX、float dY、int actionState、boolean isCurrentlyActive)
{
Log.d(Log_标签,“dx:+dx+”dy:+dy);
如果(actionState==ItemTouchHelper.ACTION\u STATE\u SWIPE){
浮动开关dX=dX;
串扫方向;
如果(滑动dx>0){
swipingDirection=ItemAdapter.SWIPING_RIGHT;
}否则,如果(滑动dx<0){
swipingDirection=ItemAdapter.SWIPING_LEFT;
}否则{
swipingDirection=ItemAdapter.SWIPE\u END;
}
//字符串swipingDirection=swipingDx>0?ItemAdapter.SWIPING_RIGHT:ItemAdapter.SWIPING_LEFT;
getDefaultUIUtil().onDraw(c,recyclerView,
((ItemAdapter.ViewHolder)ViewHolder).mFacadeLayout,dX,dY,
actionState,当前处于活动状态);
((ItemAdapter.ViewHolder)ViewHolder).设置布局可见性(滑动方向);
}否则{
getDefaultUIUtil().onDraw(c,recyclerView,
((ItemAdapter.ViewHolder)ViewHolder).itemView,dX,dY,
actionState,当前处于活动状态);
}
}
@凌驾
ChildRawOver上的公共void(Canvas c、RecyclerView、RecyclerView.ViewHolder、float dX、float dY、int actionState、boolean isCurrentlyActive)
{
如果(actionState==ItemTouchHelper.ACTION\u STATE\u SWIPE){
getDefaultUIUtil().onDrawOver(c,recyclerView,
((ItemAdapter.ViewHolder)ViewHolder).mFacadeLayout,dX,dY,
actionState,当前处于活动状态);
}否则{
getDefaultUIUtil().onDraw(c,recyclerView,
((项目a)
private ItemTouchHelper.Callback crateCallback()
    {
        return new ExtendItemTouchHelperCallback()
        {
            @Override
            public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
            {

                if (viewHolder instanceof ItemAdapter.ViewHolder)
                {

                    //this make sure that the value works for the drag and drop too
                    //return makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT) | makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP | ItemTouchHelper.DOWN);
                    return makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT);

                }
                return 0;
            }

            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
            {
                final int fromPos = viewHolder.getAdapterPosition();
                final int toPos = target.getAdapterPosition();
                Log.d(LOG_TAG, " postion " + "From: " + fromPos + " TO: " + toPos);
                mItemAdapter.move(fromPos, toPos);
                return true;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int i)
            {
                int removedId = mItemAdapter.remove(viewHolder.getAdapterPosition());

               // Snackbar.make(mRecyclerView, "Item removed, position: " + removedId, Snackbar.LENGTH_SHORT).show();


                //ExtendAsyncQueryHandler extendAsyncQueryHandler = new ExtendAsyncQueryHandler(getActivity().getContentResolver());
                //extendAsyncQueryHandler.startDelete(removedId, null, DataContract.ItemEntry.buildItemUri(removedId), null, null);

                Log.d(LOG_TAG, "removed row; " + removedId);
            }

            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
            {
                getDefaultUIUtil().clearView(((ItemAdapter.ViewHolder) viewHolder).mFacadeLayout);
//                getDefaultUIUtil().clearView(((ItemAdapter.ViewHolder) viewHolder).itemView);//                ((ItemAdapter.ViewHolder) viewHolder).setLayoutVisibility(false);
                ((ItemAdapter.ViewHolder) viewHolder).setLayoutVisibility(ItemAdapter.SWIPE_END);
            }

            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)
            {
                if (viewHolder != null) {
                    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
                        getDefaultUIUtil().onSelected(((ItemAdapter.ViewHolder) viewHolder).mFacadeLayout);
//                        ((ItemAdapter.ViewHolder) viewHolder).setLayoutVisibility(true);
                    } else if (actionState == ItemTouchHelper.ACTION_STATE_IDLE) {

                        getDefaultUIUtil().onSelected(((ItemAdapter.ViewHolder) viewHolder).itemView);
                    } else {
                        getDefaultUIUtil().onSelected(((ItemAdapter.ViewHolder) viewHolder).itemView);
                    }


                }
            }

            @Override
            public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive)
            {
                Log.d(LOG_TAG, "dx: " + dX + " dy: " + dY);



                if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {

                    float swipingDx = dX;
                    String swipingDirection;
                    if (swipingDx > 0) {
                        swipingDirection = ItemAdapter.SWIPING_RIGHT;
                    } else if (swipingDx < 0) {
                        swipingDirection = ItemAdapter.SWIPING_LEFT;
                    } else {
                        swipingDirection = ItemAdapter.SWIPE_END;
                    }
//                    String swipingDirection = swipingDx > 0 ? ItemAdapter.SWIPING_RIGHT :ItemAdapter.SWIPING_LEFT;

                    getDefaultUIUtil().onDraw(c, recyclerView,
                            ((ItemAdapter.ViewHolder) viewHolder).mFacadeLayout, dX, dY,
                            actionState, isCurrentlyActive);
                    ((ItemAdapter.ViewHolder) viewHolder).setLayoutVisibility(swipingDirection);

                } else {
                    getDefaultUIUtil().onDraw(c, recyclerView,
                            ((ItemAdapter.ViewHolder) viewHolder).itemView, dX, dY,
                            actionState, isCurrentlyActive);

                }
            }

            @Override
            public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive)
            {
                if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
                    getDefaultUIUtil().onDrawOver(c, recyclerView,
                            ((ItemAdapter.ViewHolder) viewHolder).mFacadeLayout, dX, dY,
                            actionState, isCurrentlyActive);
                } else {
                    getDefaultUIUtil().onDraw(c, recyclerView,
                            ((ItemAdapter.ViewHolder) viewHolder).itemView, dX, dY,
                            actionState, isCurrentlyActive);
//                    ((ItemAdapter.ViewHolder) viewHolder).setLayoutVisibility(false);                }
                }


            }
        };

    }