Home | History | Annotate | Download | only in touch
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.example.android.supportv7.widget.touch;
     18 
     19 import com.example.android.supportv7.Cheeses;
     20 import com.example.android.supportv7.R;
     21 import com.example.android.supportv7.widget.util.ConfigToggle;
     22 import com.example.android.supportv7.widget.util.ConfigViewHolder;
     23 
     24 import android.app.Activity;
     25 import android.graphics.Canvas;
     26 import android.os.Bundle;
     27 import android.support.v7.widget.CardView;
     28 import android.support.v7.widget.LinearLayoutManager;
     29 import android.support.v7.widget.RecyclerView;
     30 import android.support.v7.widget.helper.ItemTouchHelper;
     31 import android.view.LayoutInflater;
     32 import android.view.View;
     33 import android.view.ViewGroup;
     34 import android.widget.Button;
     35 import android.widget.TextView;
     36 
     37 import java.util.ArrayList;
     38 import java.util.Arrays;
     39 import java.util.List;
     40 
     41 /**
     42  * Sample activity from which ItemTouchHelper demo activities inherit.
     43  */
     44 abstract public class ItemTouchHelperActivity extends Activity {
     45 
     46     public RecyclerView mRecyclerView;
     47 
     48     public ItemTouchAdapter mAdapter;
     49 
     50     public ItemTouchHelper mItemTouchHelper;
     51 
     52     public ItemTouchHelper.Callback mCallback;
     53 
     54     private ConfigToggle[] mConfigToggles;
     55 
     56     @Override
     57     public void onCreate(Bundle savedInstanceState) {
     58         super.onCreate(savedInstanceState);
     59         setContentView(R.layout.activity_item_touch);
     60         mRecyclerView = findViewById(R.id.recycler_view);
     61         mRecyclerView.setHasFixedSize(true);
     62         mAdapter = createAdapter();
     63         mRecyclerView.setAdapter(mAdapter);
     64         mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
     65         mItemTouchHelper = createItemTouchHelper();
     66         mItemTouchHelper.attachToRecyclerView(mRecyclerView);
     67         initToggles();
     68     }
     69 
     70     private void initToggles() {
     71         mConfigToggles = createConfigToggles();
     72         RecyclerView configView = findViewById(R.id.config_recycler_view);
     73         configView.setAdapter(new RecyclerView.Adapter<ConfigViewHolder>() {
     74             @Override
     75             public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     76                 return new ConfigViewHolder(LayoutInflater.from(parent.getContext())
     77                         .inflate(R.layout.config_view_toggle, parent, false));
     78             }
     79 
     80             @Override
     81             public void onBindViewHolder(ConfigViewHolder holder, int position) {
     82                 ConfigToggle toggle = mConfigToggles[position];
     83                 holder.bind(toggle);
     84             }
     85 
     86             @Override
     87             public int getItemCount() {
     88                 return mConfigToggles.length;
     89             }
     90         });
     91         configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,
     92                 false));
     93         configView.setHasFixedSize(true);
     94     }
     95 
     96     abstract ConfigToggle[] createConfigToggles();
     97 
     98     public ItemTouchHelper createItemTouchHelper() {
     99         mCallback = createCallback();
    100         return new ItemTouchHelper(mCallback);
    101     }
    102 
    103     public ItemTouchHelper.Callback createCallback() {
    104         return new ItemTouchHelper.Callback() {
    105             @Override
    106             public int getMovementFlags(RecyclerView recyclerView,
    107                     RecyclerView.ViewHolder viewHolder) {
    108                 return ItemTouchHelperActivity.this.getMovementFlags(recyclerView, viewHolder);
    109             }
    110 
    111             @Override
    112             public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
    113                     RecyclerView.ViewHolder target) {
    114                 mAdapter.move(viewHolder.getAdapterPosition(), target.getAdapterPosition());
    115                 return true;
    116             }
    117 
    118             @Override
    119             public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    120                 mAdapter.delete(viewHolder.getAdapterPosition());
    121             }
    122 
    123             @Override
    124             public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
    125                 super.onSelectedChanged(viewHolder, actionState);
    126                 ItemTouchHelperActivity.this.onSelectedChanged(viewHolder, actionState);
    127             }
    128 
    129             @Override
    130             public void onChildDraw(Canvas c, RecyclerView recyclerView,
    131                     RecyclerView.ViewHolder viewHolder,
    132                     float dX, float dY, int actionState, boolean isCurrentlyActive) {
    133                 if (ItemTouchHelperActivity.this.onChildDraw(c, recyclerView, viewHolder,
    134                         dX, dY, actionState, isCurrentlyActive)) {
    135                     return;
    136                 }
    137                 super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState,
    138                         isCurrentlyActive);
    139             }
    140 
    141             @Override
    142             public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
    143                     RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
    144                     boolean isCurrentlyActive) {
    145                 if (ItemTouchHelperActivity.this.onChildDrawOver(c, recyclerView, viewHolder,
    146                         dX, dY, actionState, isCurrentlyActive)) {
    147                     return;
    148                 }
    149                 super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState,
    150                         isCurrentlyActive);
    151             }
    152 
    153             @Override
    154             public boolean isLongPressDragEnabled() {
    155                 return ItemTouchHelperActivity.this.isLongPressDragEnabled();
    156             }
    157 
    158             @Override
    159             public boolean isItemViewSwipeEnabled() {
    160                 return ItemTouchHelperActivity.this.isPointerSwipeEnabled();
    161             }
    162 
    163             @Override
    164             public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    165                 super.clearView(recyclerView, viewHolder);
    166                 ItemTouchHelperActivity.this.clearView(viewHolder);
    167             }
    168         };
    169     }
    170 
    171     /**
    172      * @return True if we should NOT call parent
    173      */
    174     public boolean onChildDraw(Canvas c, RecyclerView recyclerView,
    175             RecyclerView.ViewHolder viewHolder,
    176             float dX, float dY, int actionState, boolean isCurrentlyActive) {
    177         return false;
    178     }
    179 
    180     /**
    181      * @return True if we should NOT call parent
    182      */
    183     public boolean onChildDrawOver(Canvas c, RecyclerView recyclerView,
    184             RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
    185             boolean isCurrentlyActive) {
    186         return false;
    187     }
    188 
    189     public void clearView(RecyclerView.ViewHolder viewHolder) {
    190 
    191     }
    192 
    193     public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
    194 
    195     }
    196 
    197     public boolean isLongPressDragEnabled() {
    198         return true;
    199     }
    200 
    201     public boolean isPointerSwipeEnabled() {
    202         return true;
    203     }
    204 
    205     public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
    206         ItemTouchViewHolder itemTouchViewHolder = new ItemTouchViewHolder(
    207                 LayoutInflater.from(parent.getContext())
    208                         .inflate(R.layout.touch_item, parent, false));
    209         return itemTouchViewHolder;
    210     }
    211 
    212     abstract public int getMovementFlags(RecyclerView recyclerView,
    213             RecyclerView.ViewHolder viewHolder);
    214 
    215     public ItemTouchAdapter createAdapter() {
    216         return new ItemTouchAdapter();
    217     }
    218 
    219     public void onBind(ItemTouchViewHolder viewHolder) {
    220 
    221     }
    222 
    223     public void onCreateViewHolder(ItemTouchViewHolder viewHolder) {
    224 
    225     }
    226 
    227     public class ItemTouchViewHolder extends RecyclerView.ViewHolder {
    228 
    229         public final TextView textView;
    230 
    231         public final Button actionButton;
    232 
    233         public final CardView cardView;
    234 
    235         public final View overlay;
    236 
    237         public ItemTouchViewHolder(View itemView) {
    238             super(itemView);
    239             cardView = (CardView) itemView;
    240             textView = (TextView) itemView.findViewById(R.id.text_view);
    241             actionButton = (Button) itemView.findViewById(R.id.action_button);
    242             overlay = itemView.findViewById(R.id.overlay);
    243         }
    244     }
    245 
    246     public class ItemTouchAdapter extends RecyclerView.Adapter<ItemTouchViewHolder> {
    247 
    248         private List<String> mItems = new ArrayList<String>();
    249 
    250         public ItemTouchAdapter() {
    251             mItems.addAll(Arrays.asList(Cheeses.sCheeseStrings));
    252         }
    253 
    254         @Override
    255         public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    256             return ItemTouchHelperActivity.this.onCreateViewHolder(parent);
    257         }
    258 
    259         @Override
    260         public void onBindViewHolder(ItemTouchViewHolder holder, int position) {
    261             holder.textView.setText(mItems.get(position));
    262             onBind(holder);
    263         }
    264 
    265         public void delete(int position) {
    266             mItems.remove(position);
    267             notifyItemRemoved(position);
    268         }
    269 
    270         public void move(int from, int to) {
    271             String prev = mItems.remove(from);
    272             mItems.add(to > from ? to - 1 : to, prev);
    273             notifyItemMoved(from, to);
    274         }
    275 
    276         @Override
    277         public int getItemCount() {
    278             return mItems.size();
    279         }
    280     }
    281 
    282 
    283 }
    284