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