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/appcompat/res \
|
||||||
frameworks/support/v7/gridlayout/res \
|
frameworks/support/v7/gridlayout/res \
|
||||||
frameworks/support/v7/mediarouter/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 := \
|
LOCAL_AAPT_FLAGS := \
|
||||||
--auto-add-overlay \
|
--auto-add-overlay \
|
||||||
--extra-packages android.support.v7.appcompat \
|
--extra-packages android.support.v7.appcompat \
|
||||||
--extra-packages android.support.v7.cardview \
|
--extra-packages android.support.v7.cardview \
|
||||||
--extra-packages android.support.v7.gridlayout \
|
--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)
|
include $(BUILD_PACKAGE)
|
||||||
|
|||||||
@@ -388,5 +388,22 @@
|
|||||||
android:label="@string/palette"
|
android:label="@string/palette"
|
||||||
android:theme="@style/Theme.AppCompat" />
|
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>
|
</application>
|
||||||
|
|
||||||
|
|
||||||
</manifest>
|
</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>
|
<resources>
|
||||||
|
|
||||||
<dimen name="color_palette_size">60dp</dimen>
|
<dimen name="color_palette_size">60dp</dimen>
|
||||||
|
<dimen name="touch_item_min_height">60dp</dimen>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -178,5 +178,16 @@
|
|||||||
<string name="sorted_list_activity">Sorted List</string>
|
<string name="sorted_list_activity">Sorted List</string>
|
||||||
<string name="add_new_item">Add New Item</string>
|
<string name="add_new_item">Add New Item</string>
|
||||||
<string name="start_action_mode">Start Action Mode</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>
|
</resources>
|
||||||
|
|||||||
@@ -19,12 +19,15 @@ package com.example.android.supportv7.widget;
|
|||||||
import com.example.android.supportv7.Cheeses;
|
import com.example.android.supportv7.Cheeses;
|
||||||
import com.example.android.supportv7.R;
|
import com.example.android.supportv7.R;
|
||||||
import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
|
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.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.BaseAdapter;
|
import android.widget.BaseAdapter;
|
||||||
@@ -167,56 +170,11 @@ abstract public class BaseLayoutManagerActivity<T extends RecyclerView.LayoutMan
|
|||||||
|
|
||||||
abstract ConfigToggle[] createConfigToggles();
|
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>() {
|
private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() {
|
||||||
@Override
|
@Override
|
||||||
public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
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
|
@Override
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package com.example.android.supportv7.widget;
|
|||||||
import com.example.android.supportv7.Cheeses;
|
import com.example.android.supportv7.Cheeses;
|
||||||
import com.example.android.supportv7.R;
|
import com.example.android.supportv7.R;
|
||||||
import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
|
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.v4.view.ViewCompat;
|
||||||
import android.support.v7.widget.GridLayoutManager;
|
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.LinearLayoutManager;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import com.example.android.supportv7.R;
|
import com.example.android.supportv7.R;
|
||||||
|
import com.example.android.supportv7.widget.util.ConfigToggle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A sample activity that uses {@link LinearLayoutManager}.
|
* A sample activity that uses {@link LinearLayoutManager}.
|
||||||
@@ -41,7 +42,7 @@ public class LinearLayoutManagerActivity extends BaseLayoutManagerActivity<Linea
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
BaseLayoutManagerActivity.ConfigToggle[] createConfigToggles() {
|
ConfigToggle[] createConfigToggles() {
|
||||||
return new ConfigToggle[]{
|
return new ConfigToggle[]{
|
||||||
new ConfigToggle(this, R.string.checkbox_orientation) {
|
new ConfigToggle(this, R.string.checkbox_orientation) {
|
||||||
@Override
|
@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