android - 如何在 RecyclerView 上使用 SwipeDismissBehavior.OnDismissListener

标签 android android-design-library

我正在尝试使用设计支持库中的 SwipeDismissBehavoir。我在 RecyclerView 中列出了项目并且滑动项目必须关闭(如谷歌收件箱应用程序)。

我已经为 RecyclerView 项目设置了监听器,但是 SwipeDismissBehavior onDismiss 监听器没有被调用。

  SwipeDismissBehavior behavior = new SwipeDismissBehavior();

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams)mItemLayout.getLayoutParams();
    params.setBehavior(behavior);
    behavior.setListener(new SwipeDismissBehavior.OnDismissListener() {
        @Override
        public void onDismiss(View view) {

        }

        @Override
        public void onDragStateChanged(int i) {

        }
    });
    mItemLayout.setLayoutParams(params);

最佳答案

下面是如何通过滑动删除行的例子

主 Activity .java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerView);

        // init layout manager
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
       final ArrayList<String> list = new ArrayList<String>();
        list.add("Item1");
        list.add("Item2");
        list.add("Item3");
        list.add("Item4");
        list.add("Item5");
        list.add("Item6");

        final MyAdapter adapter = new MyAdapter(list);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);

        ItemTouchHelper swipeToDismissTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                // callback for drag-n-drop, false to skip this feature
                return false;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                // callback for swipe to dismiss, removing item from data and adapter

                list.remove(viewHolder.getAdapterPosition());
                adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
            }
        });
        swipeToDismissTouchHelper.attachToRecyclerView(recyclerView);

    }

适配器

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>    {

    ArrayList<String> dataset_;

    public static class MyViewHolder extends RecyclerView.ViewHolder{
        public Button mBtn;
        public TextView mTextView2;

        public MyViewHolder(View v){
            super(v);
            mBtn  = (Button) itemView.findViewById(R.id.delete);
            mTextView2 = (TextView) itemView.findViewById(R.id.textView2);
        }
    }


    public MyAdapter (ArrayList<String> dataset){
        dataset_ = dataset;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view,parent,false);

        MyViewHolder myViewHolder = new MyViewHolder(v);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder,int position){
        holder.mTextView2.setText(dataset_.get(position));
    }

    @Override
    public int getItemCount(){
        return dataset_.size();
    }
}

布局

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:baselineAligned="false"
              android:orientation="vertical"
              android:padding="16dp">

    <TextView
        style="?android:listSeparatorTextViewStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/heading_dismissable_recycler_view" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

RecyclerView 中的项目

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

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Medium Text"
            android:id="@+id/textView2"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/delete"
        android:text="Delete"
        android:layout_marginLeft="150dp"
        android:visibility="invisible" />
    </LinearLayout>
    </LinearLayout>

关于android - 如何在 RecyclerView 上使用 SwipeDismissBehavior.OnDismissListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30549703/

相关文章:

android - 为 materialDatePicker 设置 180 天的日历限制

android - Android Gradle 插件测试 apk 生成器是否自动对我的测试 apk 进行多索引处理?如果是这样,为什么会生成 "NoSuchMethodError"

android - TabLayout 上的样式文本

android - 展开的 CollapsingToolbarLayout 中的标题显示不正确

android - 添加android支持设计库后Gradle报错

android - 使用 fusedlocationapi 获取位置,而无需在时间间隔后请求位置更新

android - 外部库中的自定义 View 类不起作用

java - 如何从 Android 应用程序检测 WiFi 网络中连接的所有设备

android - 如何使 CardView 具有可点击和可检查的效果,以及如何使其成为深色主题?

android - Two NavigationView 的工具栏中的汉堡包图标两侧带有后退箭头动画?