2つのTextViewと2つのImageViewを含む単一のCardViewがあります。左右にスワイプして「閉じる」ことができるようにしたい。実際に右にスワイプしてインテントを送信したいのですが、後で行うことができます。今のところ、左または右にスワイプしてCardViewを閉じられるようにしたいと思います。スワイプのアニメーションも欲しいです。
_romannurik's SwipeDismissTouchListener
_ を使用してみましたが、CardViewがスワイプに応答しません。
_romannurik's
_カスタムリスナーよりも優れたソリューションがある場合は、共有してください。
これが私の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(...)
からは見ることができません。
あなたはそれをRecyclerView
に入れる必要があります(そしてあなたのCardView
がそこにある唯一のアイテムとして)
次に、_ItemTouchHelper.SimpleCallback
_をitemTouchHelper.attachToRecyclerView(recyclerView);
に使用します
それはあなたにアニメーションを与えます
_@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
}
_
スワイプ方向に基づいて特定のアクションを指定できます。
ここで完全な手順を参照してください: RecyclerViewを閉じるにはスワイプします
また、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
のリストの終わりのアニメーションが表示されます。
更新:
これが私がテストに使用した_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
を拡張します):
_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(...);
}
}
_