我有一个实现了CursorAdapter的RecyclerView,如下所示:https://gist.github.com/skyfishjy/443b7448f59be978bc59
我也有一个ItemTouchHelper附加到回收器以这种方式实现(不要介意我的Snackbar修改):
private class TouchHelperCallbacks extends ItemTouchHelper.SimpleCallback {
public TouchHelperCallbacks(int dragDirs, int swipeDirs) {
super(dragDirs, swipeDirs);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
Snackbar.make(recycler,
R.string.course_hidden,
Snackbar.LENGTH_LONG)
.setOnHideListener(new Snackbar.OnHideListener() {
@Override
public void onHide() {
//after Snackbar disappears, either because of a
//timeout or it is swiped away, remove item from db
}
})
.setAction(R.string.undo,
new View.OnClickListener() {
@Override
public void onClick(View v) {
//put card back into the recycler
}
})
.setActionTextColor(getActivity().getResources().getColor(R.color.color_accent))
.colorTheFuckingTextToWhite(getActivity())
.doStuffThatGoogleDidntFuckingDoProperly(getActivity(), null)
.show();
}
}这张卡被正确地刷走了,但它下面的卡没有被抬起来,只剩下被刷过的卡曾经所在的地方的空白。如果我在Snackbar显示时调用notifyDatasetChanged(),它将重新出现在它的前一个位置。
我希望避免访问数据库,并尽可能轻量级地撤消。我可以在Snackbar仍然显示的时候实现一个额外的列或删除/插入行,但对于这样一个简单的任务(几秒钟内3-4个查询)来说似乎太重了。
理想情况下,我希望访问当前显示在屏幕上的ViewHolders,并将它们转换为所需的高度,如果用户选择撤消,请执行相同的操作,但方向相反,然后将卡插入回去。
viewHolder.itemView.setVisibility(View.GONE)似乎没有任何效果。
发布于 2016-07-06 06:45:13
https://github.com/brnunes/SwipeableRecyclerView中的代码完全符合您的要求。
下面是我实现它的方式:
private RecyclerView rvRoutes;
(...)
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rvRoutes = (RecyclerView) view.findViewById(R.id.rvRoutes);
(...)
SwipeableRecyclerViewTouchListener swipeTouchListener =
new SwipeableRecyclerViewTouchListener(rvRoutes,
new SwipeableRecyclerViewTouchListener.SwipeListener() {
@Override
public boolean canSwipeLeft(int position) { return true; }
@Override
public boolean canSwipeRight(int position) { return true; }
@Override
public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
Toast.makeText(MainActivity.this, mItems.get(position) + " swiped left", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
Toast.makeText(MainActivity.this, mItems.get(position) + " swiped right", Toast.LENGTH_SHORT).show();
}
adapter.notifyDataSetChanged();
}
});
rvRoutes.addOnItemTouchListener(swipeTouchListener);}
这就是所需要的,因为所有上下移动项目的动画都在SwipeableRecyclerViewTouchListener类中。
https://stackoverflow.com/questions/32406144
复制相似问题