Как включить CardView в ViewPager

Я пробовал использовать CardView в ViewPager, и каждый раз, когда я прокручивал CardView влево/вправо, он переходил на следующий экран. Я хочу, чтобы карта удалила себя тогда. В настоящее время как автономные оба работают нормально, но когда я объединяю, работает только просмотр пейджера, а не закрытие карты.

Я попытался отключить ViewPager с помощью приведенного ниже кода, но этот код также отключает жесты смахивания CardView. Как я могу сделать так, чтобы только CardView имел жест, и когда вы проводите пальцем между двумя картами, тогда он должен иметь ViewPager, поскольку он не подключен к элементу карты.

Или полностью отключите ViewPager и используйте его как кнопки и включите прокрутку на CardView. Я очень ценю любую помощь. Заранее спасибо.

К вашему сведению: я пробовал android_horizontal_listview в ViewPager, и он отлично работает и точно так же.

Для ViewPager:

mPager.setOnTouchListener(new OnTouchListener()
{           
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        return true;
    }
});

Для карты:

SwipeableRecyclerViewTouchListener swipeTouchListener =

new SwipeableRecyclerViewTouchListener(mRecyclerView,
    new SwipeableRecyclerViewTouchListener.SwipeListener() {
        @Override
        public boolean canSwipe(int position) {
            return true;
        }

        @Override
        public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {
            for (int position : reverseSortedPositions) {
                mItems.remove(position);
                mAdapter.notifyItemRemoved(position);
            }
            mAdapter.notifyDataSetChanged();
        }

        @Override
        public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
            for (int position : reverseSortedPositions) {
                mItems.remove(position);
                mAdapter.notifyItemRemoved(position);
            }
            mAdapter.notifyDataSetChanged();
        }
    });

mRecyclerView.addOnItemTouchListener(swipeTouchListener);

Основная активность.java

public class MainActivity extends Activity implements ActionBar.TabListener {


    ViewPager vp;
    View viewpager_layout_1;
    View viewpager_layout_2;
    View viewpager_layout_3;
    ActionBar.Tab tab_1;
    ActionBar.Tab tab_2;
    ActionBar.Tab tab_3;
    ActionBar bar;
    /////
    String jsonstring1;
    CardViewAdapter spinnerArray;
    ImageLoader imageLoader = ImageLoader.getInstance();//
    DisplayImageOptions options;
    ArrayList<HashMap<String, String>> array_list1;
    RecyclerView recyclerView;
    RelativeLayout re1;
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        mContext = this;


        viewpager_layout_1 = new View(mContext);
        viewpager_layout_1 = getLayoutInflater().inflate(R.layout.sample1, null);


        viewpager_layout_3 = new View(mContext);
        viewpager_layout_3 = getLayoutInflater().inflate(R.layout.sample2, null);


        viewpager_layout_2 = new View(mContext);
        viewpager_layout_2 = getLayoutInflater().inflate(R.layout.sample3, null);


        vp = (ViewPager) findViewById(R.id.vp);
        bar = getActionBar();


        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        bar.setDisplayShowTitleEnabled(false);
        bar.setDisplayShowHomeEnabled(false);

        Vector<View> pages = new Vector<View>();

        pages.add(viewpager_layout_1);
        pages.add(viewpager_layout_3);
        pages.add(viewpager_layout_2);

        CustomPagerAdapter adapter = new CustomPagerAdapter(mContext, pages);
        vp.setAdapter(adapter);

        vp.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {

                bar.setSelectedNavigationItem(position);
            }
        });

        tab_1 = bar.newTab();
        tab_1.setCustomView(R.layout.tab_layout_1);
        tab_1.setTabListener(this);
        bar.addTab(tab_1);


        tab_2 = bar.newTab();
        tab_2.setCustomView(R.layout.tab_layout_2);
        tab_2.setTabListener(this);
        bar.addTab(tab_2);


        tab_3 = bar.newTab();
        tab_3.setCustomView(R.layout.tab_layout_3);
        tab_3.setTabListener(this);
        bar.addTab(tab_3);


        ////


        imageLoader.init(ImageLoaderConfiguration.createDefault(MainActivity.this));


        jsonstring1 = "[{\"category\":\"1\",\"no\":\"1\",\"image\":\"http://upload.wikimedia.org/wikipedia/commons/c/c3/Jordan_by_Lipofsky_16577.jpg\"},{\"category\":\"2\",\"no\":\"2\",\"image\":\"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Basketball_World_Cup_2014.jpg/800px-Basketball_World_Cup_2014.jpg\"},{\"category\":\"3\",\"no\":\"3\",\"image\":\"http://upload.wikimedia.org/wikipedia/commons/4/4e/Basketball_Goal.jpg\"},{\"category\":\"4\",\"no\":\"4\",\"image\":\"http://upload.wikimedia.org/wikipedia/commons/1/10/Basketball_through_hoop.jpg\"}]";

        //////////

        array_list1 = new ArrayList<HashMap<String, String>>();
        JSONArray arr = null;
        try {
            arr = new JSONArray(jsonstring1);
            for (int i = 0; i < arr.length(); i++) {
                JSONObject e1 = arr.getJSONObject(i);
                String category = e1.getString("category").trim();
                String no = e1.getString("no").trim();
                String image = e1.getString("image").trim();

                HashMap<String, String> map = new HashMap<String, String>();
                map.put("category", category);
                map.put("no", no);
                map.put("image", image);
                // adding HashList to ArrayList
                array_list1.add(map);
            }


        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        OnItemTouchListener itemTouchListener = new OnItemTouchListener() {
            @Override
            public void onCardViewTap(View view, int position) {
                Toast.makeText(MainActivity.this, "Tapped " + array_list1.get(position), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onButton1Click(View view, int position) {
                Toast.makeText(MainActivity.this, "Clicked Button1 in " + array_list1.get(position), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onButton2Click(View view, int position) {
                Toast.makeText(MainActivity.this, "Clicked Button2 in " + array_list1.get(position), Toast.LENGTH_SHORT).show();
            }
        };

        spinnerArray = new CardViewAdapter(itemTouchListener, MainActivity.this, array_list1);
        recyclerView = (RecyclerView) viewpager_layout_3.findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        SlideInBottomAnimationAdapter alphaAdapter = new SlideInBottomAnimationAdapter(spinnerArray);
        ScaleInAnimationAdapter alphaAdapter2 = new ScaleInAnimationAdapter(alphaAdapter);
        final AlphaInAnimationAdapter alphaAdapter3 = new AlphaInAnimationAdapter(alphaAdapter2);
        alphaAdapter3.setDuration(500);
        alphaAdapter3.setFirstOnly(true);
        recyclerView.setAdapter(alphaAdapter3);


        final SwipeableRecyclerViewTouchListener swipeTouchListener =
                new SwipeableRecyclerViewTouchListener(recyclerView,
                        new SwipeableRecyclerViewTouchListener.SwipeListener() {
                            @Override
                            public boolean canSwipe(int position) {
                                return true;
                            }


                            @Override
                            public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {
                                for (int position : reverseSortedPositions) {
//                                    mItems.remove(position);
                                    Toast.makeText(MainActivity.this, array_list1.get(position) + " swiped left", Toast.LENGTH_SHORT).show();
                                    array_list1.remove(position);
                                    alphaAdapter3.notifyItemRemoved(position);
                                }
                                alphaAdapter3.notifyDataSetChanged();
                            }

                            @Override
                            public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
                                for (int position : reverseSortedPositions) {
//
                                    Toast.makeText(MainActivity.this, array_list1.get(position) + " swiped right", Toast.LENGTH_SHORT).show();
                                    array_list1.remove(position);
                                    alphaAdapter3.notifyItemRemoved(position);
                                }
                                alphaAdapter3.notifyDataSetChanged();
                            }
                        });

        recyclerView.addOnItemTouchListener(swipeTouchListener);


    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
        //  Toast.makeText(getBaseContext(), tab.toString(), 5).show();
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        //      Toast.makeText(getBaseContext(), tab.toString(), 5).show();
        vp.setCurrentItem(tab.getPosition());
        if (tab.getPosition() == 2) {


            tab_2.setCustomView(null);
            tab_2.setCustomView(R.layout.tab_layout_2);

            tab_1.setCustomView(null);
            tab_1.setCustomView(R.layout.tab_layout_1);


            tab_3.setCustomView(null);
            tab_3.setCustomView(R.layout.tab_layout_33);


        } else if (tab.getPosition() == 1) {


            tab_2.setCustomView(null);
            tab_2.setCustomView(R.layout.tab_layout_22);

            tab_1.setCustomView(null);
            tab_1.setCustomView(R.layout.tab_layout_1);


            tab_3.setCustomView(null);
            tab_3.setCustomView(R.layout.tab_layout_3);


        } else if (tab.getPosition() == 0) {

            tab_1.setCustomView(null);
            tab_1.setCustomView(R.layout.tab_layout_11);


            if (tab_2 != null) {

                tab_2.setCustomView(null);
                tab_2.setCustomView(R.layout.tab_layout_2);
            }


            if (tab_3 != null) {

                tab_3.setCustomView(null);
                tab_3.setCustomView(R.layout.tab_layout_3);
            }


        }
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
        //  Toast.makeText(getBaseContext(), tab.toString(), 5).show();

    }


    public interface OnItemTouchListener {

        // this will disallow the touch request for parent scroll on touch of child view


        /**
         * Callback invoked when the user Taps one of the RecyclerView items
         *
         * @param view     the CardView touched
         * @param position the index of the item touched in the RecyclerView
         */
        public void onCardViewTap(View view, int position);

        /**
         * Callback invoked when the Button1 of an item is touched
         *
         * @param view     the Button touched
         * @param position the index of the item touched in the RecyclerView
         */
        public void onButton1Click(View view, int position);

        /**
         * Callback invoked when the Button2 of an item is touched
         *
         * @param view     the Button touched
         * @param position the index of the item touched in the RecyclerView
         */
        public void onButton2Click(View view, int position);
    }

    public class CustomPagerAdapter extends PagerAdapter {

        private final Context mContext;
        private final Vector<View> pages;

        public CustomPagerAdapter(Context context, Vector<View> pages) {
            this.mContext = context;
            this.pages = pages;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {

            View page = pages.get(position);
            container.addView(page);


            return page;
        }

        @Override
        public int getCount() {
            return pages.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view.equals(object);
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }


    }

    public class CardViewAdapter extends RecyclerView.Adapter<CardViewAdapter.ViewHolder> {
        ArrayList<HashMap<String, String>> d;
        Activity a;
        private List<String> cards;
        private OnItemTouchListener onItemTouchListener2;


        public CardViewAdapter(OnItemTouchListener onItemTouchListener, Activity a, ArrayList<HashMap<String, String>> d) {
            //  this.cards = cards;
            this.onItemTouchListener2 = onItemTouchListener;
            this.a = a;
            this.d = d;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view_layout, viewGroup, false);
            return new ViewHolder(v);
        }

        @Override
        public void onBindViewHolder(ViewHolder viewHolder, int i) {
            //  viewHolder.title.setText(cards.get(i));

            HashMap<String, String> item = d.get(i);
            viewHolder.title.setText(item.get("category"));
            imageLoader.displayImage(item.get("image"), viewHolder.im2);

        }

        @Override
        public int getItemCount() {
            //   return d == null ? 0 : d.size();
            return (null != d ? d.size() : 0);
            // return d.size();
        }

        public class ViewHolder extends RecyclerView.ViewHolder {

            MotionEvent motionEvent;
            private int mSlop;
            private int mMinFlingVelocity;
            private int mMaxFlingVelocity;
            private long mAnimationTime;
            // Fixed properties
            //   private RecyclerView mRecyclerView;
            private SwipeableRecyclerViewTouchListener.SwipeListener mSwipeListener;

            // Transient properties
            private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero
            private int mDismissAnimationRefCount = 0;
            private float mAlpha;
            private float mDownX;
            private float mDownY;
            private boolean mSwiping;
            private int mSwipingSlop;
            private VelocityTracker mVelocityTracker;
            private int mDownPosition;
            private int mAnimatingPosition = ListView.INVALID_POSITION;
            private View mDownView;
            private boolean mPaused;
            private float mFinalDelta;
            ///
            private TextView title;
            private Button button1;
            private Button button2;
            private ImageView im2;

            public ViewHolder(View itemView) {
                super(itemView);
                title = (TextView) itemView.findViewById(R.id.card_view_title);

                im2 = (ImageView) itemView.findViewById(R.id.imageView);

            }
        }
    }


}

Activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/relativelayout_1">


    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentStart="true"
        android:id="@+id/linearlayout_1"
        android:orientation="vertical">

        <android.support.v4.view.ViewPager
            android:id="@+id/vp"
            android:layout_width="match_parent"
            android:layout_height="0dp"

            android:layout_weight="1"
            />


    </LinearLayout>


</RelativeLayout>

образец2.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/re1"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical">

</android.support.v7.widget.RecyclerView>

</RelativeLayout>

person jason    schedule 29.04.2015    source источник
comment
ViewPager не подходит для клонов Tinder. Попробуйте github.com/kikoso/Swipeable-Cards или github.com/Diolor/Swipecards.   -  person Paul Burke    schedule 29.04.2015
comment
Но как я могу заставить его работать? Я использую github.com/brnunes/SwipeableRecyclerView. Но я хотел бы использовать в пейджере.   -  person jason    schedule 29.04.2015


Ответы (3)


Чтобы решить эту проблему, я использовал ItemTouchHelper, предоставленный Android, чтобы легко удалить элемент из RecyclerView.

См. реализацию ниже:

Основная активность:

Здесь у меня есть реализация ViewPager и его дочерний Fragments.

package za.co.gadgetgirl.testcardpager;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

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

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);
    }

    private void setupViewPager(ViewPager viewPager) {
        Adapter adapter = new Adapter(getSupportFragmentManager());

        Frag1 frag1 = new Frag1();
        Frag2 frag2 = new Frag2();
        Frag3 frag3 = new Frag3();

        adapter.addFragment(frag1, "frag1");
        adapter.addFragment(frag2, "frag2");
        adapter.addFragment(frag3, "frag3");
        viewPager.setAdapter(adapter);
    }

    static class Adapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragments = new ArrayList<>();
        private final List<String> mFragmentTitles = new ArrayList<>();

        public Adapter(FragmentManager fm) {
            super(fm);
        }

        public void addFragment(Fragment fragment, String title) {
            mFragments.add(fragment);
            mFragmentTitles.add(title);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragments.get(position);
        }

        @Override
        public int getCount() {
            return mFragments.size();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitles.get(position);
        }
    }
}

Фрагмент1:

На этом Fragment у меня есть RecyclerView, к которому прикреплен ItemTouchHelper. ItemTouchHelper прислушивается к методу onSwiped(...), который определен в интерфейсе SimpleCallback, и я просто удаляю перехваченный элемент в этом методе.

package za.co.gadgetgirl.testcardpager;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Frag1 extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.frag1, container, false);

        final RecyclerView rv = (RecyclerView) v.findViewById(R.id.rv);
        final LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        rv.setLayoutManager(llm);

        final RVAdapter rvAdapter = new RVAdapter(Person.initializeData());
        rv.setAdapter(rvAdapter);

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                rvAdapter.removeItem(viewHolder.getAdapterPosition());
            }
        });

        itemTouchHelper.attachToRecyclerView(rv);

        return v;
    }

}

RVAdapter:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {


    //...implementation...

    public void removeItem(int position) {
        persons.remove(position);
        notifyItemRemoved(position);
    }
}

Чтобы использовать ItemTouchHelper, вам понадобится зависимость appcompat-v7:22.2.0 и выше, определенная в вашем файле gradle приложения.

person Cindy    schedule 15.05.2017

Я не использовал SwipeableRecyclerView раньше, так что ничего не могу сказать. У меня такая же проблема, как и у вас раньше. Я решаю это, обрабатывая событие onTouch базового контейнера фрагмента (например, LinearLayout, RelativeLayout), и это работает для меня. Почему бы вам не попробовать это решение и не вернуться к нам

person Sun Maung Oo    schedule 01.05.2015
comment
Вы также пытались переопределить метод onInterceptTouchEvent() SwipeableRecyclerViewTouchListener? - person Sun Maung Oo; 01.05.2015
comment
Можете ли вы поделиться фрагментом кода для того же самого. Я использую pager.requestDisallowInterceptTouchEvent(true); но он отключает весь просмотр-пейджер. Как вы с этим справились? - person jason; 01.05.2015
comment
У меня есть 3 базовых контейнера. Tab1, Tab2 и Tab3, все относительные макеты, и в них есть recyclerview и viewpager с просмотром карт. - person jason; 01.05.2015
comment
@jason, код на самом деле простой. В моем случае базовым контейнером фрагмента является RelativeLayout1 public void onActivityCreated(Bundle paramBundle) { super.onActivityCreated(paramBundle); RelativeLayout relativeLayout1 = (RelativeLayout) this.parentLinear .findViewById(R.id.RelativeLayout1); relativeLayout1.setOnTouchListener(this); } @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { switch (v.getId()) { case R.id.RelativeLayout1: return true; break; default: break; } return false; } - person Sun Maung Oo; 08.05.2015
comment
Он не работает даже сейчас. У меня есть 3 вкладки, и все 3 имеют внутри него cardviewpager и viewpager в основном макете. Поэтому каждый раз, когда я прокручиваю, он переходит на следующую вкладку, и функция прокрутки карты не выполняется. Как я могу это реализовать. Я пытался приведенный выше код с относительным макетом в основном макете, а также относительным макетом на средней вкладке, и оба они отображают один и тот же результат. В основном ничего не изменилось. Может ли кто-нибудь помочь мне здесь. Спасибо. - person jason; 16.05.2015
comment
@jason, ваш карточный пейджер использует все пространство на вкладке с android:layout_height="match_parent"? - person Sun Maung Oo; 17.05.2015
comment
Должен ли я опубликовать здесь весь код с вкладками и xml? .Вы также можете запустить проект. - person jason; 18.05.2015
comment
@jason, было бы здорово, если бы ты выложил весь код. Если возможно, вы также можете опубликовать свой программный код, чтобы я мог посмотреть, какое событие вы слушаете, например, событие onTouch и так далее. - person Sun Maung Oo; 18.05.2015
comment
Я обновил вопрос. Пожалуйста, посмотрите и дайте мне знать, как я могу это исправить. Я очень ценю помощь. Спасибо. - person jason; 21.05.2015
comment
@jason, поправьте меня, если я ошибаюсь, ваш макет похож на псевдокод, как показано ниже. <View Pager> <Layout With Tab> <Card Viewer/> <Card Viewer/> <Card Viewer/> </Layout With Tab> <Layout With Tab> <Card Viewer/> <Card Viewer/> <Card Viewer/> </Layout With Tab> <Layout With Tab> <Card Viewer/> <Card Viewer/> <Card Viewer/> </Layout With Tab> </View Pager> - person Sun Maung Oo; 22.05.2015
comment
@jason, не могли бы вы также опубликовать снимок экрана с вашим макетом. - person Sun Maung Oo; 22.05.2015
comment
@jason, глядя на ваш код, я чувствую, что у вас проблемы с макетом. Под проблемой компоновки я имею в виду, что вы не видите вид, который, по вашему мнению, вы видели, из-за вида, который очень похож. Можете ли вы попробовать подтвердить, что то, что вы видите на экране, это то, что вы действительно хотели увидеть? Я буду плох, если вы потратите много часов на отладку проблемы, только обнаружив, что ваш код на самом деле все время работает. - person Sun Maung Oo; 22.05.2015
comment
@jason, есть ли причина, по которой вам следует использовать SwipeableRecyclerView? вы можете попробовать Swipeable-Cards, как было предложено выше, или найти аналогичную библиотеку здесь - person Sun Maung Oo; 22.05.2015

Для случая использования, который вы описываете, я не думаю, что ViewPager - это класс, который вы хотите использовать для получения действия смахивания. Мне кажется, что комбинация CoordinatorLayout и Более подходящим является SwipeDismissBehavior.

EDIT: см. мое решение ниже:

XML макета:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.CardView
            android:id="@+id/cardView"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    </android.support.v7.widget.CardView>

</android.support.design.widget.CoordinatorLayout>

Мероприятия:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CardView cardView = (CardView) findViewById(R.id.cardView);

        SwipeDismissBehavior<CardView> behavior = new SwipeDismissBehavior();
        behavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_START_TO_END);
        behavior.setListener(new SwipeDismissBehavior.OnDismissListener() {
            @Override
            public void onDismiss(View view) {
                finish(); // close activity if desired 
            }

            @Override
            public void onDragStateChanged(int state) {

            }
        });

        ((CoordinatorLayout.LayoutParams) cardView.getLayoutParams()).setBehavior(behavior);
    }
}

Кроме того, вот несколько примеров использования CoordinatorLayout. :

Мне не удалось найти много примеров использования SwipeDismissBehavior в частности, но концепции аналогичны ссылкам выше.

В качестве альтернативы вы также можете следовать предложениям аналогичного сообщения: Макет прокрутки Android для закрытия чтобы получить желаемые результаты.

Надеюсь это поможет.

person J. Beck    schedule 09.10.2015
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person Mamoun Benghezal; 09.10.2015