首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在光标支持的RecyclerView中隐藏(和重新显示)卡片

在光标支持的RecyclerView中隐藏(和重新显示)卡片
EN

Stack Overflow用户
提问于 2015-09-05 04:31:20
回答 1查看 537关注 0票数 1

我有一个实现了CursorAdapter的RecyclerView,如下所示:https://gist.github.com/skyfishjy/443b7448f59be978bc59

我也有一个ItemTouchHelper附加到回收器以这种方式实现(不要介意我的Snackbar修改):

代码语言:javascript
复制
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)似乎没有任何效果。

EN

回答 1

Stack Overflow用户

发布于 2016-07-06 06:45:13

https://github.com/brnunes/SwipeableRecyclerView中的代码完全符合您的要求。

下面是我实现它的方式:

代码语言:javascript
复制
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类中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32406144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档