Android 使用TouchHelperCallback部分和完全刷取Recyclerview
我正在尝试使用api TouchHelperCallback实现对Recyclerview的部分和完全扫描,这是一组库,如和,但如何使用api实现这一点 我能用下面的代码实现全刷,请任何人就如何解决这个问题提出建议 谢谢 代码库: ExtendedItemTouchHelperCallback: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
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); }
}
}
};
}