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 17package com.example.android.supportv7.widget.touch; 18 19import com.example.android.supportv7.Cheeses; 20import com.example.android.supportv7.R; 21import com.example.android.supportv7.widget.util.ConfigToggle; 22import com.example.android.supportv7.widget.util.ConfigViewHolder; 23 24import android.app.Activity; 25import android.graphics.Canvas; 26import android.os.Bundle; 27import android.support.v7.widget.CardView; 28import android.support.v7.widget.LinearLayoutManager; 29import android.support.v7.widget.RecyclerView; 30import android.support.v7.widget.helper.ItemTouchHelper; 31import android.view.LayoutInflater; 32import android.view.View; 33import android.view.ViewGroup; 34import android.widget.Button; 35import android.widget.TextView; 36 37import java.util.ArrayList; 38import java.util.Arrays; 39import java.util.List; 40 41/** 42 * Sample activity from which ItemTouchHelper demo activities inherit. 43 */ 44abstract 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