如何在 Android CardView 上添加滑动功能? [英] How to add swipe functionality on Android CardView?

查看:23
本文介绍了如何在 Android CardView 上添加滑动功能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 CardView,其中包含两个 TextView 和两个 ImageView.我希望能够左右滑动以关闭".我实际上想向右滑动以发送意图,但可以稍后完成.现在,我希望能够通过向左或向右滑动来关闭 CardView.我也想要滑动的动画.

I have a single CardView that contains two TextViews and two ImageViews. I want to be able to swipe left and right to "dismiss". I actually want swipe right to send an Intent but that can be done later. For now, I want to be able to dismiss the CardView by swiping left or right. I also want the animation of swiping.

我尝试使用 <代码>romannurik 的 SwipeDismissTouchListener 但 CardView 不响应滑动.

I tried using romannurik's SwipeDismissTouchListener but the CardView does not respond to swiping.

如果有人有比 romannurik 的 自定义侦听器更好的解决方案,请分享.

If anyone has a better solution than romannurik's custom listener, please share.

这是我的 CardView 布局:

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/generate"
    map:cardCornerRadius="@dimen/_3sdp"
    map:cardElevation="@dimen/_8sdp"
    android:id="@+id/restaurantContainer">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="horizontal">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/thumbnail"
                    android:layout_width="@dimen/_75sdp"
                    android:layout_height="@dimen/_75sdp"
                    android:layout_margin="@dimen/_5sdp" />

                <ImageView
                    android:id="@+id/rating"
                    android:layout_width="@dimen/_75sdp"
                    android:layout_height="@dimen/_15sdp"
                    android:layout_margin="@dimen/_5sdp" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/name"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="@dimen/_5sdp"
                    android:gravity="top"
                    android:textAppearance="?android:attr/textAppearanceLarge" />

                <TextView
                    android:id="@+id/categories"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_margin="@dimen/_5sdp"
                    android:textAppearance="?android:attr/textAppearanceMedium" />
            </LinearLayout>

        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

            <com.google.android.gms.maps.MapView
                android:id="@+id/mapView"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                map:cameraZoom="14"
                map:liteMode="true"
                map:mapType="normal" />

        </LinearLayout>

    </LinearLayout>

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

我如何设置 SwipeDismissTouchListener:

RelativeLayout rootLayout;
CardView restaurantCardView;

...

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        rootLayout = (RelativeLayout) inflater.inflate(R.layout.fragment_main, container, false);

        restaurantCardView = (CardView) rootLayout.findViewById(R.id.restaurantContainer);

        restaurantCardView.setOnTouchListener(new SwipeDismissTouchListener(restaurantCardView, null, new SwipeDismissTouchListener.DismissCallbacks() {
            @Override
            public boolean canDismiss(Object token) {
                Log.d("Chris", "canDismiss() called with: " + "token = [" + token + "]");
                return true;
            }

            @Override
            public void onDismiss(View view, Object token) {
                Log.d("Chris", "onDismiss() called with: " + "view = [" + view + "], token = [" + token + "]");
            }
        }));
    ....

    return rootLayout;

我可以从 canDismiss(...) 看到日志,但不能从 onDismiss(...) 看到日志.

I am able to see the log from canDismiss(...) but not from onDismiss(...).

推荐答案

你必须把它放在 RecyclerView(你的 CardView 作为那里的唯一项目)

You'll have to put it inside RecyclerView (and your CardView as the only item there)

然后,使用ItemTouchHelper.SimpleCallbackitemTouchHelper.attachToRecyclerView(recyclerView);

它会给你动画和

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
}

您可以根据滑动方向指定特定操作.

you can specify particular action based on the swipe direction.

在此处查看完整说明:滑动以关闭 RecyclerView

此外,您必须在 RecyclerView 中禁用垂直滚动:

Also, you'll have to disable vertical scroll in RecyclerView:

public class UnscrollableLinearLayoutManager extends LinearLayoutManager {
    public UnscrollableLinearLayoutManager(Context context) {
        super(context);
    }

    @Override
    public boolean canScrollVertically() {
        return false;
    }
}

.....

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new UnscrollableLinearLayoutManager(this));
recyclerView.setAdapter(new RestaurantCardAdapter());

否则 - 一旦你尝试向上或向下滚动 - 你会看到 RecyclerView 的列表结束动画.

Otherwise - once you'll try to scroll up or down - you'd see RecyclerView's end-of-list animations.

更新:

这是我用于测试的RecyclerView.Adapter:

private class RestaurantCardAdapter extends RecyclerView.Adapter {
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new RestaurantViewHolder(new RestaurantCard(parent.getContext()));
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}

    @Override
    public int getItemCount() {
        return 1;
    }

    private class RestaurantViewHolder extends RecyclerView.ViewHolder {
        public RestaurantViewHolder(View itemView) {
            super(itemView);
        }
    }
}

RestaurantCard - 只是一个自定义的 View(在我们的例子中扩展了 CardView):

RestaurantCard - is just a custom View (extends CardView in our case):

public class RestaurantCard extends CardView {
    public RestaurantCard(Context context) {
        super(context);
        initialize(context);
    }

    public RestaurantCard(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize(context);
    }

    private void initialize(Context context){
        LayoutInflater.from(context).inflate(R.layout.card, this);
        // ImageView imageView = (ImageView)getView.findViewById(...);
    }
}

这篇关于如何在 Android CardView 上添加滑动功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆