Android 5 RecyclerView就像Gmail一样

Tim*_*Tim 1 android android-listview material-design android-recyclerview

我正在玩RecyclerView,我发现没有太多关于如何使用它的文档

我从文档中看到GMail应用程序正在使用RecyclerView,但在应用程序中它具有许多普通RecyclerView不支持的功能:

它有截图

https://developer.android.com/training/material/lists-cards.html

特征:

  1. onTouch时列出项目突出显示
  2. 向左/向右滑动即可删除

我可以知道如何实现这些功能吗?

我发现有关于如何实现OnClickListener的讨论,(这些解决方案非常缓慢,因为它不断检查列表项区域)

RecyclerView onClick

但是,如果将它与Gmail应用程序进行比较,它会快速而流畅!

我可以知道如何实现上述2个功能吗?他们是如何做到的呢?他们使用Recyclerview还是ListView?

我确信我可以使用ListView实现这些功能,但我不知道如何使用Recyclerview实现它们.

Вла*_*ков 6

向左/向右滑动可以这样执行: 使用ItemTouchHelper滑动 - jmcdale的回答

SwipeToDismiss可从Android支持库中随时使用.

  1. 将'recyclerview-v7:22.2.+'依赖添加到build.gradle:

    compile 'com.android.support:recyclerview-v7:22.2.+'

  2. 将remove方法添加到RecyclerView.Adapter实现中:

    public class ExampleAdapter extends Adapter<ExampleItem> {
        [...]
        public void remove(int position) {
            list.remove(position);
            notifyItemRemoved(position);
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用ItemTouchHelper和ItemTouchHelper.Callback:

    ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
    
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
             //Remove swiped item
             adapter.remove(viewHolder.getAdapterPosition())
        }
    
        @Override
        public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            //Available drag and drop directions
            int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
            //Available swipe directions
            int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
            return makeMovementFlags(dragFlags, swipeFlags);
        }
    
        //Disable or Enable drag and drop by long press
        @Override
        public boolean isLongPressDragEnabled() {
            //return false;
            return true;
        }
    
        //Disable or Enable swiping
        @Override
        public boolean isItemViewSwipeEnabled() {
            //return false;
            return true;
        }
    
    };
    
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将ItemTouchHelper附加到RecyclerView

    itemTouchHelper.attachToRecyclerView(recyclerView);
    
    Run Code Online (Sandbox Code Playgroud)

另一个有用的链接:使用recyclerView拖动和滑动