ItemTouchHelper demo activities
NOTICE: TBR Change-Id: I8d4c0bd2662fc0deb6465de753c1107938fbe6ee
This commit is contained in:
@@ -35,13 +35,16 @@ LOCAL_RESOURCE_DIR = \
|
||||
frameworks/support/v7/appcompat/res \
|
||||
frameworks/support/v7/gridlayout/res \
|
||||
frameworks/support/v7/mediarouter/res \
|
||||
frameworks/support/v7/recyclerview/res \
|
||||
frameworks/support/v7/cardview/res
|
||||
frameworks/support/v7/cardview/res \
|
||||
frameworks/support/design/res \
|
||||
frameworks/support/v7/recyclerview/res
|
||||
|
||||
LOCAL_AAPT_FLAGS := \
|
||||
--auto-add-overlay \
|
||||
--extra-packages android.support.v7.appcompat \
|
||||
--extra-packages android.support.v7.cardview \
|
||||
--extra-packages android.support.v7.gridlayout \
|
||||
--extra-packages android.support.v7.recyclerview \
|
||||
--extra-packages android.support.v7.mediarouter
|
||||
--extra-packages android.support.v7.mediarouter \
|
||||
--extra-packages android.support.design \
|
||||
--extra-packages android.support.v7.recyclerview
|
||||
include $(BUILD_PACKAGE)
|
||||
|
||||
@@ -388,5 +388,22 @@
|
||||
android:label="@string/palette"
|
||||
android:theme="@style/Theme.AppCompat" />
|
||||
|
||||
<!-- item touch helper demo activities-->
|
||||
<activity android:name=".widget.touch.SwipeToDismissActivity"
|
||||
android:label="@string/swipe_to_dismiss_activity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="com.example.android.supportv7.SAMPLE_CODE"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name=".widget.touch.DragAndDropActivity"
|
||||
android:label="@string/drag_and_drop_activity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="com.example.android.supportv7.SAMPLE_CODE"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
|
||||
</manifest>
|
||||
|
||||
29
samples/Support7Demos/res/layout/activity_item_touch.xml
Normal file
29
samples/Support7Demos/res/layout/activity_item_touch.xml
Normal file
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2015 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<android.support.v7.widget.RecyclerView
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="60dp"
|
||||
android:scrollbars="horizontal"
|
||||
android:id="@+id/config_recycler_view"/>
|
||||
<android.support.v7.widget.RecyclerView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/recycler_view"/>
|
||||
</LinearLayout>
|
||||
6
samples/Support7Demos/res/layout/config_view_toggle.xml
Normal file
6
samples/Support7Demos/res/layout/config_view_toggle.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
</CheckBox>
|
||||
26
samples/Support7Demos/res/layout/touch_item.xml
Normal file
26
samples/Support7Demos/res/layout/touch_item.xml
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:card="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
card:cardUseCompatPadding="true"
|
||||
android:background="@color/card_classic"
|
||||
android:layout_height="wrap_content">
|
||||
<TextView android:layout_width="wrap_content"
|
||||
android:textColor="@android:color/black"
|
||||
android:layout_height="@dimen/touch_item_min_height"
|
||||
android:id="@+id/text_view"/>
|
||||
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
|
||||
android:layout_gravity="end|center_vertical"
|
||||
android:id="@+id/action_button" android:visibility="gone"/>
|
||||
<FrameLayout
|
||||
android:id="@+id/overlay"
|
||||
android:visibility="gone"
|
||||
android:background="@color/card_tropical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/touch_item_min_height">
|
||||
<TextView android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:text="@string/swiping"/>
|
||||
</FrameLayout>
|
||||
</android.support.v7.widget.CardView>
|
||||
@@ -17,5 +17,6 @@
|
||||
<resources>
|
||||
|
||||
<dimen name="color_palette_size">60dp</dimen>
|
||||
<dimen name="touch_item_min_height">60dp</dimen>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -178,5 +178,16 @@
|
||||
<string name="sorted_list_activity">Sorted List</string>
|
||||
<string name="add_new_item">Add New Item</string>
|
||||
<string name="start_action_mode">Start Action Mode</string>
|
||||
|
||||
<string name="swipe_to_dismiss_activity">RecyclerView/ItemTouchHelper/Swipe To Dismiss</string>
|
||||
<string name="drag_and_drop_activity">RecyclerView/ItemTouchHelper/Drag and Drop Activity</string>
|
||||
<string name="swipe_start">start</string>
|
||||
<string name="swipe_end">end</string>
|
||||
<string name="pointer_swipe_enabled">pointer swipe</string>
|
||||
<string name="custom_swipe_enabled">custom swipe</string>
|
||||
<string name="drag_up">up</string>
|
||||
<string name="drag_down">down</string>
|
||||
<string name="long_press_drag">long press drag</string>
|
||||
<string name="drag">drag me</string>
|
||||
<string name="swipe">swipe me</string>
|
||||
<string name="swiping">swiping</string>
|
||||
</resources>
|
||||
|
||||
@@ -19,12 +19,15 @@ package com.example.android.supportv7.widget;
|
||||
import com.example.android.supportv7.Cheeses;
|
||||
import com.example.android.supportv7.R;
|
||||
import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
|
||||
import com.example.android.supportv7.widget.util.ConfigToggle;
|
||||
import com.example.android.supportv7.widget.util.ConfigViewHolder;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
@@ -167,56 +170,11 @@ abstract public class BaseLayoutManagerActivity<T extends RecyclerView.LayoutMan
|
||||
|
||||
abstract ConfigToggle[] createConfigToggles();
|
||||
|
||||
private class ConfigViewHolder extends RecyclerView.ViewHolder
|
||||
implements CompoundButton.OnCheckedChangeListener {
|
||||
|
||||
private CheckBox mCheckBox;
|
||||
|
||||
private ConfigToggle mConfigToggle;
|
||||
|
||||
public ConfigViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
mCheckBox = (CheckBox) itemView;
|
||||
mCheckBox.setOnCheckedChangeListener(this);
|
||||
}
|
||||
|
||||
public void bind(ConfigToggle toggle) {
|
||||
mConfigToggle = toggle;
|
||||
mCheckBox.setText(toggle.getText());
|
||||
mCheckBox.setChecked(toggle.isChecked());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (mConfigToggle != null) {
|
||||
mConfigToggle.onChange(isChecked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public abstract static class ConfigToggle {
|
||||
|
||||
private String mLabel;
|
||||
|
||||
protected ConfigToggle(Context context, int labelId) {
|
||||
mLabel = context.getResources().getString(labelId);
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return mLabel;
|
||||
}
|
||||
|
||||
abstract public boolean isChecked();
|
||||
|
||||
abstract public void onChange(boolean newValue);
|
||||
}
|
||||
|
||||
|
||||
private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() {
|
||||
@Override
|
||||
public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
return new ConfigViewHolder(new CheckBox(parent.getContext()));
|
||||
return new ConfigViewHolder(LayoutInflater.from(parent.getContext())
|
||||
.inflate(R.layout.config_view_toggle, parent, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.example.android.supportv7.widget;
|
||||
import com.example.android.supportv7.Cheeses;
|
||||
import com.example.android.supportv7.R;
|
||||
import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
|
||||
import com.example.android.supportv7.widget.util.ConfigToggle;
|
||||
|
||||
import android.support.v4.view.ViewCompat;
|
||||
import android.support.v7.widget.GridLayoutManager;
|
||||
|
||||
@@ -22,6 +22,7 @@ import android.support.v4.view.ViewCompat;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import com.example.android.supportv7.R;
|
||||
import com.example.android.supportv7.widget.util.ConfigToggle;
|
||||
|
||||
/**
|
||||
* A sample activity that uses {@link LinearLayoutManager}.
|
||||
@@ -41,7 +42,7 @@ public class LinearLayoutManagerActivity extends BaseLayoutManagerActivity<Linea
|
||||
}
|
||||
|
||||
@Override
|
||||
BaseLayoutManagerActivity.ConfigToggle[] createConfigToggles() {
|
||||
ConfigToggle[] createConfigToggles() {
|
||||
return new ConfigToggle[]{
|
||||
new ConfigToggle(this, R.string.checkbox_orientation) {
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.supportv7.widget.touch;
|
||||
|
||||
import com.example.android.supportv7.R;
|
||||
import com.example.android.supportv7.widget.util.ConfigToggle;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.os.Build;
|
||||
import android.support.v4.view.MotionEventCompat;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.helper.ItemTouchHelper;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
public class DragAndDropActivity extends ItemTouchHelperActivity {
|
||||
|
||||
boolean mDragUpEnabled = true;
|
||||
boolean mDragDownEnabled = true;
|
||||
boolean mLongPressDragEnabled = true;
|
||||
|
||||
@Override
|
||||
ConfigToggle[] createConfigToggles() {
|
||||
return new ConfigToggle[]{
|
||||
new ConfigToggle(this, R.string.drag_up) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mDragUpEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mDragUpEnabled = newValue;
|
||||
}
|
||||
},
|
||||
new ConfigToggle(this, R.string.drag_down) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mDragDownEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mDragDownEnabled = newValue;
|
||||
}
|
||||
},
|
||||
new ConfigToggle(this, R.string.long_press_drag) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mLongPressDragEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mLongPressDragEnabled = newValue;
|
||||
mAdapter.notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLongPressDragEnabled() {
|
||||
return mLongPressDragEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBind(ItemTouchViewHolder viewHolder) {
|
||||
super.onBind(viewHolder);
|
||||
viewHolder.actionButton.setVisibility(mLongPressDragEnabled ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearView(RecyclerView.ViewHolder viewHolder) {
|
||||
super.clearView(viewHolder);
|
||||
ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
|
||||
touchVH.cardView.setCardBackgroundColor(getResources().getColor(android.R.color.white));
|
||||
touchVH.overlay.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
|
||||
ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
|
||||
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
|
||||
touchVH.cardView.setCardBackgroundColor(getResources().getColor(R.color.card_aquatic));
|
||||
}
|
||||
super.onSelectedChanged(viewHolder, actionState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
|
||||
final ItemTouchViewHolder vh = super.onCreateViewHolder(parent);
|
||||
vh.actionButton.setText(R.string.drag);
|
||||
vh.actionButton.setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
|
||||
mItemTouchHelper.startDrag(vh);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return vh;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
||||
return mCallback.makeMovementFlags(
|
||||
(mDragUpEnabled ? ItemTouchHelper.UP : 0) |
|
||||
(mDragDownEnabled ? ItemTouchHelper.DOWN : 0), 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,283 @@
|
||||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.supportv7.widget.touch;
|
||||
|
||||
import com.example.android.supportv7.Cheeses;
|
||||
import com.example.android.supportv7.R;
|
||||
import com.example.android.supportv7.widget.util.ConfigToggle;
|
||||
import com.example.android.supportv7.widget.util.ConfigViewHolder;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.graphics.Canvas;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.CardView;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.helper.ItemTouchHelper;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Sample activity from which ItemTouchHelper demo activities inherit.
|
||||
*/
|
||||
abstract public class ItemTouchHelperActivity extends Activity {
|
||||
|
||||
public RecyclerView mRecyclerView;
|
||||
|
||||
public ItemTouchAdapter mAdapter;
|
||||
|
||||
public ItemTouchHelper mItemTouchHelper;
|
||||
|
||||
public ItemTouchHelper.Callback mCallback;
|
||||
|
||||
private ConfigToggle[] mConfigToggles;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_item_touch);
|
||||
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
|
||||
mRecyclerView.setHasFixedSize(true);
|
||||
mAdapter = createAdapter();
|
||||
mRecyclerView.setAdapter(mAdapter);
|
||||
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
|
||||
mItemTouchHelper = createItemTouchHelper();
|
||||
mItemTouchHelper.attachToRecyclerView(mRecyclerView);
|
||||
initToggles();
|
||||
}
|
||||
|
||||
private void initToggles() {
|
||||
mConfigToggles = createConfigToggles();
|
||||
RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view);
|
||||
configView.setAdapter(new RecyclerView.Adapter<ConfigViewHolder>() {
|
||||
@Override
|
||||
public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
return new ConfigViewHolder(LayoutInflater.from(parent.getContext())
|
||||
.inflate(R.layout.config_view_toggle, parent, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(ConfigViewHolder holder, int position) {
|
||||
ConfigToggle toggle = mConfigToggles[position];
|
||||
holder.bind(toggle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mConfigToggles.length;
|
||||
}
|
||||
});
|
||||
configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,
|
||||
false));
|
||||
configView.setHasFixedSize(true);
|
||||
}
|
||||
|
||||
abstract ConfigToggle[] createConfigToggles();
|
||||
|
||||
public ItemTouchHelper createItemTouchHelper() {
|
||||
mCallback = createCallback();
|
||||
return new ItemTouchHelper(mCallback);
|
||||
}
|
||||
|
||||
public ItemTouchHelper.Callback createCallback() {
|
||||
return new ItemTouchHelper.Callback() {
|
||||
@Override
|
||||
public int getMovementFlags(RecyclerView recyclerView,
|
||||
RecyclerView.ViewHolder viewHolder) {
|
||||
return ItemTouchHelperActivity.this.getMovementFlags(recyclerView, viewHolder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
|
||||
RecyclerView.ViewHolder target) {
|
||||
mAdapter.move(viewHolder.getAdapterPosition(), target.getAdapterPosition());
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
|
||||
mAdapter.delete(viewHolder.getAdapterPosition());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
|
||||
super.onSelectedChanged(viewHolder, actionState);
|
||||
ItemTouchHelperActivity.this.onSelectedChanged(viewHolder, actionState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChildDraw(Canvas c, RecyclerView recyclerView,
|
||||
RecyclerView.ViewHolder viewHolder,
|
||||
float dX, float dY, int actionState, boolean isCurrentlyActive) {
|
||||
if (ItemTouchHelperActivity.this.onChildDraw(c, recyclerView, viewHolder,
|
||||
dX, dY, actionState, isCurrentlyActive)) {
|
||||
return;
|
||||
}
|
||||
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState,
|
||||
isCurrentlyActive);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
|
||||
RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
|
||||
boolean isCurrentlyActive) {
|
||||
if (ItemTouchHelperActivity.this.onChildDrawOver(c, recyclerView, viewHolder,
|
||||
dX, dY, actionState, isCurrentlyActive)) {
|
||||
return;
|
||||
}
|
||||
super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState,
|
||||
isCurrentlyActive);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLongPressDragEnabled() {
|
||||
return ItemTouchHelperActivity.this.isLongPressDragEnabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isItemViewSwipeEnabled() {
|
||||
return ItemTouchHelperActivity.this.isPointerSwipeEnabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
||||
super.clearView(recyclerView, viewHolder);
|
||||
ItemTouchHelperActivity.this.clearView(viewHolder);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @return True if we should NOT call parent
|
||||
*/
|
||||
public boolean onChildDraw(Canvas c, RecyclerView recyclerView,
|
||||
RecyclerView.ViewHolder viewHolder,
|
||||
float dX, float dY, int actionState, boolean isCurrentlyActive) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return True if we should NOT call parent
|
||||
*/
|
||||
public boolean onChildDrawOver(Canvas c, RecyclerView recyclerView,
|
||||
RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
|
||||
boolean isCurrentlyActive) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void clearView(RecyclerView.ViewHolder viewHolder) {
|
||||
|
||||
}
|
||||
|
||||
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
|
||||
|
||||
}
|
||||
|
||||
public boolean isLongPressDragEnabled() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean isPointerSwipeEnabled() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
|
||||
ItemTouchViewHolder itemTouchViewHolder = new ItemTouchViewHolder(
|
||||
LayoutInflater.from(parent.getContext())
|
||||
.inflate(R.layout.touch_item, parent, false));
|
||||
return itemTouchViewHolder;
|
||||
}
|
||||
|
||||
abstract public int getMovementFlags(RecyclerView recyclerView,
|
||||
RecyclerView.ViewHolder viewHolder);
|
||||
|
||||
public ItemTouchAdapter createAdapter() {
|
||||
return new ItemTouchAdapter();
|
||||
}
|
||||
|
||||
public void onBind(ItemTouchViewHolder viewHolder) {
|
||||
|
||||
}
|
||||
|
||||
public void onCreateViewHolder(ItemTouchViewHolder viewHolder) {
|
||||
|
||||
}
|
||||
|
||||
public class ItemTouchViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
public final TextView textView;
|
||||
|
||||
public final Button actionButton;
|
||||
|
||||
public final CardView cardView;
|
||||
|
||||
public final View overlay;
|
||||
|
||||
public ItemTouchViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
cardView = (CardView) itemView;
|
||||
textView = (TextView) itemView.findViewById(R.id.text_view);
|
||||
actionButton = (Button) itemView.findViewById(R.id.action_button);
|
||||
overlay = itemView.findViewById(R.id.overlay);
|
||||
}
|
||||
}
|
||||
|
||||
public class ItemTouchAdapter extends RecyclerView.Adapter<ItemTouchViewHolder> {
|
||||
|
||||
private List<String> mItems = new ArrayList<String>();
|
||||
|
||||
public ItemTouchAdapter() {
|
||||
mItems.addAll(Arrays.asList(Cheeses.sCheeseStrings));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
return ItemTouchHelperActivity.this.onCreateViewHolder(parent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(ItemTouchViewHolder holder, int position) {
|
||||
holder.textView.setText(mItems.get(position));
|
||||
onBind(holder);
|
||||
}
|
||||
|
||||
public void delete(int position) {
|
||||
mItems.remove(position);
|
||||
notifyItemRemoved(position);
|
||||
}
|
||||
|
||||
public void move(int from, int to) {
|
||||
String prev = mItems.remove(from);
|
||||
mItems.add(to > from ? to - 1 : to, prev);
|
||||
notifyItemMoved(from, to);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mItems.size();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.supportv7.widget.touch;
|
||||
|
||||
import com.example.android.supportv7.R;
|
||||
import com.example.android.supportv7.widget.util.ConfigToggle;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.graphics.Canvas;
|
||||
import android.os.Build;
|
||||
import android.support.v4.view.MotionEventCompat;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.helper.ItemTouchHelper;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
public class SwipeToDismissActivity extends ItemTouchHelperActivity {
|
||||
boolean mSwipeStartEnabled = true;
|
||||
boolean mSwipeEndEnabled = true;
|
||||
boolean mPointerSwipeEnabled = true;
|
||||
boolean mCustomSwipeEnabled = false;
|
||||
|
||||
@Override
|
||||
ConfigToggle[] createConfigToggles() {
|
||||
ConfigToggle[] configToggles = {
|
||||
new ConfigToggle(this, R.string.swipe_start) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mSwipeStartEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mSwipeStartEnabled = newValue;
|
||||
}
|
||||
},
|
||||
new ConfigToggle(this, R.string.swipe_end) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mSwipeEndEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mSwipeEndEnabled = newValue;
|
||||
}
|
||||
},
|
||||
new ConfigToggle(this, R.string.pointer_swipe_enabled) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mPointerSwipeEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mPointerSwipeEnabled = newValue;
|
||||
mAdapter.notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
};
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
ConfigToggle[] copy = new ConfigToggle[configToggles.length + 1];
|
||||
System.arraycopy(configToggles, 0, copy, 0, configToggles.length);
|
||||
copy[copy.length - 1] = new ConfigToggle(this, R.string.custom_swipe_enabled) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mCustomSwipeEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mCustomSwipeEnabled = newValue;
|
||||
}
|
||||
};
|
||||
return copy;
|
||||
} else {
|
||||
return configToggles;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBind(ItemTouchViewHolder viewHolder) {
|
||||
super.onBind(viewHolder);
|
||||
viewHolder.actionButton.setVisibility(mPointerSwipeEnabled ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearView(RecyclerView.ViewHolder viewHolder) {
|
||||
super.clearView(viewHolder);
|
||||
ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
|
||||
touchVH.cardView.setCardBackgroundColor(getResources().getColor(android.R.color.white));
|
||||
touchVH.overlay.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
|
||||
ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
|
||||
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
|
||||
touchVH.cardView.setCardBackgroundColor(getResources().getColor(R.color.card_aquatic));
|
||||
if (mCustomSwipeEnabled) {
|
||||
// hide it
|
||||
touchVH.overlay.setTranslationX(viewHolder.itemView.getWidth());
|
||||
touchVH.overlay.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
super.onSelectedChanged(viewHolder, actionState);
|
||||
}
|
||||
|
||||
@Override
|
||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||
public boolean onChildDraw(Canvas c, RecyclerView recyclerView,
|
||||
RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
|
||||
boolean isCurrentlyActive) {
|
||||
if (!mCustomSwipeEnabled) {
|
||||
return false;
|
||||
}
|
||||
ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
|
||||
final float dir = Math.signum(dX);
|
||||
if (dir == 0) {
|
||||
touchVH.overlay.setTranslationX(-touchVH.overlay.getWidth());
|
||||
} else {
|
||||
final float overlayOffset = dX - dir * viewHolder.itemView.getWidth();
|
||||
touchVH.overlay.setTranslationX(overlayOffset);
|
||||
}
|
||||
float alpha = (float) (.2 + .8 * Math.abs(dX) / viewHolder.itemView.getWidth());
|
||||
touchVH.overlay.setAlpha(alpha);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
|
||||
final ItemTouchViewHolder vh = super.onCreateViewHolder(parent);
|
||||
vh.actionButton.setText(R.string.swipe);
|
||||
vh.actionButton.setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
|
||||
mItemTouchHelper.startSwipe(vh);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return vh;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPointerSwipeEnabled() {
|
||||
return mPointerSwipeEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
||||
return mCallback.makeMovementFlags(0,
|
||||
(mSwipeStartEnabled ? ItemTouchHelper.START : 0) |
|
||||
(mSwipeEndEnabled ? ItemTouchHelper.END : 0));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.supportv7.widget.util;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
abstract public class ConfigToggle {
|
||||
private String mLabel;
|
||||
|
||||
protected ConfigToggle(Context context, int labelId) {
|
||||
mLabel = context.getResources().getString(labelId);
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return mLabel;
|
||||
}
|
||||
|
||||
abstract public boolean isChecked();
|
||||
|
||||
abstract public void onChange(boolean newValue);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.supportv7.widget.util;
|
||||
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
|
||||
public class ConfigViewHolder extends RecyclerView.ViewHolder
|
||||
implements CompoundButton.OnCheckedChangeListener {
|
||||
|
||||
private CheckBox mCheckBox;
|
||||
|
||||
private ConfigToggle mConfigToggle;
|
||||
|
||||
public ConfigViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
mCheckBox = (CheckBox) itemView;
|
||||
mCheckBox.setOnCheckedChangeListener(this);
|
||||
}
|
||||
|
||||
public void bind(ConfigToggle toggle) {
|
||||
mConfigToggle = toggle;
|
||||
mCheckBox.setText(toggle.getText());
|
||||
mCheckBox.setChecked(toggle.isChecked());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (mConfigToggle != null) {
|
||||
mConfigToggle.onChange(isChecked);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user