diff --git a/README.md b/README.md
index 2eb762d..df4a65c 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ Time passed, finally...as you see right now.

-[Download Demo](https://github.com/daimajia/AndroidSwipeLayout/releases/download/v1.1.6/AndroidSwipeLayout-v1.1.6.apk)
+[Download Demo](https://github.com/daimajia/AndroidSwipeLayout/releases/download/v1.1.8/AndroidSwipeLayout-v1.1.8.apk)
Before I made this, I actually found some libraries (eg.[SwipeListView](https://github.com/47deg/android-swipelistview)) that helps developers to integrate swiping with your UI component.
@@ -38,8 +38,9 @@ When I start to make this library, I set some goals:
```groovy
dependencies {
+ compile 'com.android.support:recyclerview-v7:21.0.0'
compile 'com.android.support:support-v4:20.+'
- compile "com.daimajia.swipelayout:library:1.1.7@aar"
+ compile "com.daimajia.swipelayout:library:1.1.8@aar"
}
```
@@ -51,17 +52,22 @@ dependencies {
support-v4
r6
+
+ com.google.android
+ recyclerview-v7
+ 21.0.0
+
com.daimajia.swipelayout
library
- 1.1.7
+ 1.1.8
apklib
```
#### Eclipse
-[AndroidSwipeLayout-v1.1.6.jar](https://github.com/daimajia/AndroidSwipeLayout/releases/download/v1.1.6/AndroidSwipeLayout-v1.1.6.jar)
+[AndroidSwipeLayout-v1.1.8.jar](https://github.com/daimajia/AndroidSwipeLayout/releases/download/v1.1.8/AndroidSwipeLayout-v1.1.8.jar)
### Step 2
diff --git a/build.gradle b/build.gradle
index a75fc81..6356aab 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:0.12.+'
+ classpath 'com.android.tools.build:gradle:1.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/demo/build.gradle b/demo/build.gradle
index ae2fca1..2b122cd 100644
--- a/demo/build.gradle
+++ b/demo/build.gradle
@@ -1,11 +1,14 @@
apply plugin: 'com.android.application'
+repositories {
+ jcenter()
+}
+
android {
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
defaultConfig {
- applicationId "com.daimajia.swipedemo"
minSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION)
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
versionName project.VERSION_NAME
@@ -13,16 +16,21 @@ android {
}
buildTypes {
release {
- runProguard false
+ minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
+ lintOptions {
+ abortOnError false
+ }
}
dependencies {
compile project(":library")
- compile 'com.nineoldandroids:library:2.4.0'
+ compile 'com.android.support:recyclerview-v7:21.0.0'
compile 'com.daimajia.easing:library:1.0.0@aar'
compile 'com.daimajia.androidanimations:library:1.1.2@aar'
compile 'com.nineoldandroids:library:2.4.0'
+ // This dude gave a shoutout to you (daimajia) on his github page:
+ compile 'jp.wasabeef:recyclerview-animators:1.0.3@aar'
}
diff --git a/demo/src/main/AndroidManifest.xml b/demo/src/main/AndroidManifest.xml
index 3415667..0f57bf1 100644
--- a/demo/src/main/AndroidManifest.xml
+++ b/demo/src/main/AndroidManifest.xml
@@ -1,24 +1,28 @@
+ xmlns:tools="http://schemas.android.com/tools"
+ package="com.daimajia.swipedemo">
+
+
+ android:theme="@style/AppTheme">
+ android:label="@string/app_name">
-
-
-
+
+
+
+
diff --git a/demo/src/main/java/com/daimajia/swipedemo/GridViewExample.java b/demo/src/main/java/com/daimajia/swipedemo/GridViewExample.java
index 8e79c45..ff46588 100644
--- a/demo/src/main/java/com/daimajia/swipedemo/GridViewExample.java
+++ b/demo/src/main/java/com/daimajia/swipedemo/GridViewExample.java
@@ -8,6 +8,7 @@ import android.widget.AdapterView;
import android.widget.GridView;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
+import com.daimajia.swipe.util.Attributes;
import com.daimajia.swipedemo.adapter.GridViewAdapter;
public class GridViewExample extends Activity{
@@ -18,7 +19,7 @@ public class GridViewExample extends Activity{
setContentView(R.layout.gridview);
final GridView gridView = (GridView)findViewById(R.id.gridview);
final GridViewAdapter adapter = new GridViewAdapter(this);
- adapter.setMode(SwipeItemMangerImpl.Mode.Multiple);
+ adapter.setMode(Attributes.Mode.Multiple);
gridView.setAdapter(adapter);
gridView.setSelected(false);
gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
diff --git a/demo/src/main/java/com/daimajia/swipedemo/ListViewExample.java b/demo/src/main/java/com/daimajia/swipedemo/ListViewExample.java
index 3079cf4..ab6edf4 100644
--- a/demo/src/main/java/com/daimajia/swipedemo/ListViewExample.java
+++ b/demo/src/main/java/com/daimajia/swipedemo/ListViewExample.java
@@ -1,8 +1,10 @@
package com.daimajia.swipedemo;
+import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
+import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
@@ -14,7 +16,9 @@ import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
+import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
+import com.daimajia.swipe.util.Attributes;
import com.daimajia.swipedemo.adapter.ListViewAdapter;
public class ListViewExample extends Activity {
@@ -22,11 +26,18 @@ public class ListViewExample extends Activity {
private ListView mListView;
private ListViewAdapter mAdapter;
private Context mContext = this;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
- mListView = (ListView)findViewById(R.id.listview);
+ mListView = (ListView) findViewById(R.id.listview);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setTitle("ListView");
+ }
+ }
/**
* The following comment is the sample usage of ArraySwipeAdapter.
@@ -39,17 +50,17 @@ public class ListViewExample extends Activity {
mAdapter = new ListViewAdapter(this);
mListView.setAdapter(mAdapter);
- mAdapter.setMode(SwipeItemMangerImpl.Mode.Single);
+ mAdapter.setMode(Attributes.Mode.Single);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
- Toast.makeText(mContext, "Click", Toast.LENGTH_SHORT).show();
+ ((SwipeLayout)(mListView.getChildAt(position - mListView.getFirstVisiblePosition()))).open(true);
}
});
mListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
- Log.e("ListView","OnTouch");
+ Log.e("ListView", "OnTouch");
return false;
}
});
@@ -63,7 +74,7 @@ public class ListViewExample extends Activity {
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
- Log.e("ListView","onScrollStateChanged");
+ Log.e("ListView", "onScrollStateChanged");
}
@Override
@@ -104,10 +115,14 @@ public class ListViewExample extends Activity {
startActivity(new Intent(this, ListViewExample.class));
finish();
return true;
- }else if(id == R.id.action_gridview){
+ } else if (id == R.id.action_gridview) {
startActivity(new Intent(this, GridViewExample.class));
finish();
return true;
+ } else if (id == R.id.action_recycler) {
+ startActivity(new Intent(this, RecyclerViewExample.class));
+ finish();
+ return true;
}
return super.onOptionsItemSelected(item);
}
diff --git a/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java b/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java
index f006a86..c4d5ce1 100644
--- a/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java
+++ b/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java
@@ -137,9 +137,11 @@ public class MyActivity extends Activity {
} else if (id == R.id.action_gridview) {
startActivity(new Intent(this, GridViewExample.class));
return true;
- } else if (id == R.id.action_nexted) {
+ } else if (id == R.id.action_nested) {
startActivity(new Intent(this, NestedExample.class));
return true;
+ } else if (id == R.id.action_recycler) {
+ startActivity(new Intent(this, RecyclerViewExample.class));
}
return super.onOptionsItemSelected(item);
}
diff --git a/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java.orig b/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java.orig
new file mode 100644
index 0000000..54ff83a
--- /dev/null
+++ b/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java.orig
@@ -0,0 +1,174 @@
+package com.daimajia.swipedemo;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Toast;
+
+import com.daimajia.swipe.SwipeLayout;
+import com.nineoldandroids.view.ViewHelper;
+
+public class MyActivity extends Activity {
+
+ private SwipeLayout sample1, sample2, sample3;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+// SwipeLayout swipeLayout = (SwipeLayout)findViewById(R.id.godfather);
+// swipeLayout.setDragEdge(SwipeLayout.DragEdge.Bottom); // Set in XML
+
+ //sample1
+
+ sample1 = (SwipeLayout) findViewById(R.id.sample1);
+ sample1.setShowMode(SwipeLayout.ShowMode.LayDown);
+ sample1.setDragEdges(SwipeLayout.DragEdge.Left, SwipeLayout.DragEdge.Right);
+ // When using multiple drag edges it's a good idea to pass the ids of the views that you're using for the left, right, top bottom views (-1 if you're not using a particular view)
+ sample1.setBottomViewIds(R.id.bottom_wrapper, R.id.bottom_wrapper_2, -1, -1);
+ sample1.addRevealListener(R.id.delete, new SwipeLayout.OnRevealListener() {
+ @Override
+ public void onReveal(View child, SwipeLayout.DragEdge edge, float fraction, int distance) {
+
+ }
+ });
+
+ sample1.findViewById(R.id.star2).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(MyActivity.this, "Star", Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ sample1.findViewById(R.id.trash2).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(MyActivity.this, "Trash Bin", Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ sample1.findViewById(R.id.magnifier2).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(MyActivity.this, "Magnifier", Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ //sample2
+
+ sample2 = (SwipeLayout) findViewById(R.id.sample2);
+ sample2.setShowMode(SwipeLayout.ShowMode.LayDown);
+ sample2.setDragEdge(SwipeLayout.DragEdge.Right);
+// sample2.setShowMode(SwipeLayout.ShowMode.PullOut);
+ sample2.findViewById(R.id.star).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(MyActivity.this, "Star", Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ sample2.findViewById(R.id.trash).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(MyActivity.this, "Trash Bin", Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ sample2.findViewById(R.id.magnifier).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(MyActivity.this, "Magnifier", Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ sample2.findViewById(R.id.click).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(MyActivity.this, "Yo", Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ //sample3
+
+ sample3 = (SwipeLayout) findViewById(R.id.sample3);
+ sample3.setDragEdge(SwipeLayout.DragEdge.Top);
+ sample3.addRevealListener(R.id.bottom_wrapper_child1, new SwipeLayout.OnRevealListener() {
+ @Override
+ public void onReveal(View child, SwipeLayout.DragEdge edge, float fraction, int distance) {
+ View star = child.findViewById(R.id.star);
+ float d = child.getHeight() / 2 - star.getHeight() / 2;
+ ViewHelper.setTranslationY(star, d * fraction);
+ ViewHelper.setScaleX(star, fraction + 0.6f);
+ ViewHelper.setScaleY(star, fraction + 0.6f);
+ int c = (Integer) evaluate(fraction, Color.parseColor("#dddddd"), Color.parseColor("#4C535B"));
+ child.setBackgroundColor(c);
+ }
+ });
+ sample3.findViewById(R.id.star).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(MyActivity.this, "Yo!", Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.my, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+ if (id == R.id.action_listview) {
+ startActivity(new Intent(this, ListViewExample.class));
+ return true;
+ } else if (id == R.id.action_gridview) {
+ startActivity(new Intent(this, GridViewExample.class));
+ return true;
+<<<<<<< HEAD
+ } else if (id == R.id.action_nexted) {
+=======
+ } else if (id == R.id.action_nested) {
+>>>>>>> upstream/master
+ startActivity(new Intent(this, NestedExample.class));
+ return true;
+ } else if (id == R.id.action_recycler) {
+ startActivity(new Intent(this, RecyclerViewExample.class));
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ /*
+ Color transition method.
+ */
+ public Object evaluate(float fraction, Object startValue, Object endValue) {
+ int startInt = (Integer) startValue;
+ int startA = (startInt >> 24) & 0xff;
+ int startR = (startInt >> 16) & 0xff;
+ int startG = (startInt >> 8) & 0xff;
+ int startB = startInt & 0xff;
+
+ int endInt = (Integer) endValue;
+ int endA = (endInt >> 24) & 0xff;
+ int endR = (endInt >> 16) & 0xff;
+ int endG = (endInt >> 8) & 0xff;
+ int endB = endInt & 0xff;
+
+ return (int) ((startA + (int) (fraction * (endA - startA))) << 24) |
+ (int) ((startR + (int) (fraction * (endR - startR))) << 16) |
+ (int) ((startG + (int) (fraction * (endG - startG))) << 8) |
+ (int) ((startB + (int) (fraction * (endB - startB))));
+ }
+}
diff --git a/demo/src/main/java/com/daimajia/swipedemo/RecyclerViewExample.java b/demo/src/main/java/com/daimajia/swipedemo/RecyclerViewExample.java
new file mode 100644
index 0000000..2c34426
--- /dev/null
+++ b/demo/src/main/java/com/daimajia/swipedemo/RecyclerViewExample.java
@@ -0,0 +1,112 @@
+package com.daimajia.swipedemo;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import com.daimajia.swipe.util.Attributes;
+import com.daimajia.swipedemo.adapter.RecyclerViewAdapter;
+import com.daimajia.swipedemo.adapter.util.DividerItemDecoration;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import jp.wasabeef.recyclerview.animators.FadeInLeftAnimator;
+
+public class RecyclerViewExample extends Activity {
+
+ /**
+ * RecyclerView: The new recycler view replaces the list view. Its more modular and therefore we
+ * must implement some of the functionality ourselves and attach it to our recyclerview.
+ *
+ * 1) Position items on the screen: This is done with LayoutManagers
+ * 2) Animate & Decorate views: This is done with ItemAnimators & ItemDecorators
+ * 3) Handle any touch events apart from scrolling: This is now done in our adapter's ViewHolder
+ */
+
+ private RecyclerView recyclerView;
+ private RecyclerView.Adapter mAdapter;
+
+ private ArrayList mDataSet;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.recyclerview);
+ recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setTitle("RecyclerView");
+ }
+ }
+
+ // Layout Managers:
+ recyclerView.setLayoutManager(new LinearLayoutManager(this));
+
+ // Item Decorator:
+ recyclerView.addItemDecoration(new DividerItemDecoration(getResources().getDrawable(R.drawable.divider)));
+ recyclerView.setItemAnimator(new FadeInLeftAnimator());
+
+ // Adapter:
+ String[] adapterData = new String[]{"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"};
+ mDataSet = new ArrayList(Arrays.asList(adapterData));
+ mAdapter = new RecyclerViewAdapter(this, mDataSet);
+ ((RecyclerViewAdapter) mAdapter).setMode(Attributes.Mode.Single);
+ recyclerView.setAdapter(mAdapter);
+
+ /* Listeners */
+ recyclerView.setOnScrollListener(onScrollListener);
+ }
+
+ /**
+ * Substitute for our onScrollListener for RecyclerView
+ */
+ RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
+ @Override
+ public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
+ super.onScrollStateChanged(recyclerView, newState);
+ Log.e("ListView", "onScrollStateChanged");
+ }
+
+ @Override
+ public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+ super.onScrolled(recyclerView, dx, dy);
+ // Could hide open views here if you wanted. //
+ }
+ };
+
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.my, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+ if (id == R.id.action_listview) {
+ startActivity(new Intent(this, ListViewExample.class));
+ finish();
+ return true;
+ } else if (id == R.id.action_gridview) {
+ startActivity(new Intent(this, GridViewExample.class));
+ finish();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+}
diff --git a/demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewAdapter.java b/demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewAdapter.java
new file mode 100644
index 0000000..206733b
--- /dev/null
+++ b/demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewAdapter.java
@@ -0,0 +1,105 @@
+package com.daimajia.swipedemo.adapter;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.daimajia.androidanimations.library.Techniques;
+import com.daimajia.androidanimations.library.YoYo;
+import com.daimajia.swipe.SimpleSwipeListener;
+import com.daimajia.swipe.SwipeLayout;
+import com.daimajia.swipe.adapters.RecyclerSwipeAdapter;
+import com.daimajia.swipe.implments.SwipeItemRecyclerMangerImpl;
+import com.daimajia.swipedemo.R;
+
+import java.util.ArrayList;
+
+public class RecyclerViewAdapter extends RecyclerSwipeAdapter {
+
+ public static class SimpleViewHolder extends RecyclerView.ViewHolder {
+ SwipeLayout swipeLayout;
+ TextView textViewPos;
+ TextView textViewData;
+ Button buttonDelete;
+
+ public SimpleViewHolder(View itemView) {
+ super(itemView);
+ swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipe);
+ textViewPos = (TextView) itemView.findViewById(R.id.position);
+ textViewData = (TextView) itemView.findViewById(R.id.text_data);
+ buttonDelete = (Button) itemView.findViewById(R.id.delete);
+
+ itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Log.d(getClass().getSimpleName(), "onItemSelected: " + textViewData.getText().toString());
+ Toast.makeText(view.getContext(), "onItemSelected: " + textViewData.getText().toString(), Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+ }
+
+ private Context mContext;
+ private ArrayList mDataset;
+
+ //protected SwipeItemRecyclerMangerImpl mItemManger = new SwipeItemRecyclerMangerImpl(this);
+
+ public RecyclerViewAdapter(Context context, ArrayList objects) {
+ this.mContext = context;
+ this.mDataset = objects;
+ }
+
+ @Override
+ public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, parent, false);
+ return new SimpleViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(final SimpleViewHolder viewHolder, final int position) {
+ String item = mDataset.get(position);
+ viewHolder.swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown);
+ viewHolder.swipeLayout.addSwipeListener(new SimpleSwipeListener() {
+ @Override
+ public void onOpen(SwipeLayout layout) {
+ YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(layout.findViewById(R.id.trash));
+ }
+ });
+ viewHolder.swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {
+ @Override
+ public void onDoubleClick(SwipeLayout layout, boolean surface) {
+ Toast.makeText(mContext, "DoubleClick", Toast.LENGTH_SHORT).show();
+ }
+ });
+ viewHolder.buttonDelete.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mItemManger.removeShownLayouts(viewHolder.swipeLayout);
+ mDataset.remove(position);
+ notifyItemRemoved(position);
+ notifyItemRangeChanged(position, mDataset.size());
+ mItemManger.closeAllItems();
+ Toast.makeText(view.getContext(), "Deleted " + viewHolder.textViewData.getText().toString() + "!", Toast.LENGTH_SHORT).show();
+ }
+ });
+ viewHolder.textViewPos.setText((position + 1) + ".");
+ viewHolder.textViewData.setText(item);
+ mItemManger.bindView(viewHolder.itemView, position);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mDataset.size();
+ }
+
+ @Override
+ public int getSwipeLayoutResourceId(int position) {
+ return R.id.swipe;
+ }
+}
diff --git a/demo/src/main/java/com/daimajia/swipedemo/adapter/util/DividerItemDecoration.java b/demo/src/main/java/com/daimajia/swipedemo/adapter/util/DividerItemDecoration.java
new file mode 100644
index 0000000..85b5b3d
--- /dev/null
+++ b/demo/src/main/java/com/daimajia/swipedemo/adapter/util/DividerItemDecoration.java
@@ -0,0 +1,125 @@
+package com.daimajia.swipedemo.adapter.util;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.AttributeSet;
+import android.view.View;
+
+public class DividerItemDecoration extends RecyclerView.ItemDecoration {
+
+ private Drawable mDivider;
+ private boolean mShowFirstDivider = false;
+ private boolean mShowLastDivider = false;
+
+
+ public DividerItemDecoration(Context context, AttributeSet attrs) {
+ final TypedArray a = context
+ .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});
+ mDivider = a.getDrawable(0);
+ a.recycle();
+ }
+
+ public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,
+ boolean showLastDivider) {
+ this(context, attrs);
+ mShowFirstDivider = showFirstDivider;
+ mShowLastDivider = showLastDivider;
+ }
+
+ public DividerItemDecoration(Drawable divider) {
+ mDivider = divider;
+ }
+
+ public DividerItemDecoration(Drawable divider, boolean showFirstDivider,
+ boolean showLastDivider) {
+ this(divider);
+ mShowFirstDivider = showFirstDivider;
+ mShowLastDivider = showLastDivider;
+ }
+
+ @Override
+ public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
+ RecyclerView.State state) {
+ super.getItemOffsets(outRect, view, parent, state);
+ if (mDivider == null) {
+ return;
+ }
+ if (parent.getChildPosition(view) < 1) {
+ return;
+ }
+
+ if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
+ outRect.top = mDivider.getIntrinsicHeight();
+ } else {
+ outRect.left = mDivider.getIntrinsicWidth();
+ }
+ }
+
+ @Override
+ public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
+ if (mDivider == null) {
+ super.onDrawOver(c, parent, state);
+ return;
+ }
+
+ // Initialization needed to avoid compiler warning
+ int left = 0, right = 0, top = 0, bottom = 0, size;
+ int orientation = getOrientation(parent);
+ int childCount = parent.getChildCount();
+
+ if (orientation == LinearLayoutManager.VERTICAL) {
+ size = mDivider.getIntrinsicHeight();
+ left = parent.getPaddingLeft();
+ right = parent.getWidth() - parent.getPaddingRight();
+ } else { //horizontal
+ size = mDivider.getIntrinsicWidth();
+ top = parent.getPaddingTop();
+ bottom = parent.getHeight() - parent.getPaddingBottom();
+ }
+
+ for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {
+ View child = parent.getChildAt(i);
+ RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
+
+ if (orientation == LinearLayoutManager.VERTICAL) {
+ top = child.getTop() - params.topMargin;
+ bottom = top + size;
+ } else { //horizontal
+ left = child.getLeft() - params.leftMargin;
+ right = left + size;
+ }
+ mDivider.setBounds(left, top, right, bottom);
+ mDivider.draw(c);
+ }
+
+ // show last divider
+ if (mShowLastDivider && childCount > 0) {
+ View child = parent.getChildAt(childCount - 1);
+ RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
+ if (orientation == LinearLayoutManager.VERTICAL) {
+ top = child.getBottom() + params.bottomMargin;
+ bottom = top + size;
+ } else { // horizontal
+ left = child.getRight() + params.rightMargin;
+ right = left + size;
+ }
+ mDivider.setBounds(left, top, right, bottom);
+ mDivider.draw(c);
+ }
+ }
+
+ private int getOrientation(RecyclerView parent) {
+ if (parent.getLayoutManager() instanceof LinearLayoutManager) {
+ LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
+ return layoutManager.getOrientation();
+ } else {
+ throw new IllegalStateException(
+ "DividerItemDecoration can only be used with a LinearLayoutManager.");
+ }
+ }
+}
\ No newline at end of file
diff --git a/demo/src/main/java/com/daimajia/swipedemo/adapter/util/RecyclerItemClickListener.java b/demo/src/main/java/com/daimajia/swipedemo/adapter/util/RecyclerItemClickListener.java
new file mode 100644
index 0000000..af4021b
--- /dev/null
+++ b/demo/src/main/java/com/daimajia/swipedemo/adapter/util/RecyclerItemClickListener.java
@@ -0,0 +1,40 @@
+package com.daimajia.swipedemo.adapter.util;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+
+public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
+ private OnItemClickListener mListener;
+
+ public interface OnItemClickListener {
+ public void onItemClick(View view, int position);
+ }
+
+ GestureDetector mGestureDetector;
+
+ public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
+ mListener = listener;
+ mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
+ @Override
+ public boolean onSingleTapUp(MotionEvent e) {
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
+ View childView = view.findChildViewUnder(e.getX(), e.getY());
+ if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
+ mListener.onItemClick(childView, view.getChildPosition(childView));
+ }
+ return false;
+ }
+
+ @Override
+ public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
+ }
+}
diff --git a/demo/src/main/res/drawable/divider.xml b/demo/src/main/res/drawable/divider.xml
new file mode 100644
index 0000000..111d79d
--- /dev/null
+++ b/demo/src/main/res/drawable/divider.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/src/main/res/layout/listview_item.xml b/demo/src/main/res/layout/listview_item.xml
index e88954f..092f786 100644
--- a/demo/src/main/res/layout/listview_item.xml
+++ b/demo/src/main/res/layout/listview_item.xml
@@ -1,60 +1,61 @@
-
-
+
+
+ android:layout_height="80dp"
+ android:background="#FF5534"
+ android:gravity="center"
+ android:tag="Bottom3"
+ android:weightSum="10">
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+ android:layout_height="match_parent"
+ android:tag="Hover"
+ android:text="Do not, for one repulse, forgo the purpose that you resolved to effort. " />
+
+
\ No newline at end of file
diff --git a/demo/src/main/res/layout/listview_item.xml.orig b/demo/src/main/res/layout/listview_item.xml.orig
new file mode 100644
index 0000000..516b240
--- /dev/null
+++ b/demo/src/main/res/layout/listview_item.xml.orig
@@ -0,0 +1,68 @@
+
+
+
+
+=======
+ android:layout_height="80dp"
+ android:background="#FF5534"
+ android:gravity="center"
+ android:tag="Bottom3"
+ android:weightSum="10">
+>>>>>>> upstream/master
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/src/main/res/layout/recyclerview.xml b/demo/src/main/res/layout/recyclerview.xml
new file mode 100644
index 0000000..3f1387f
--- /dev/null
+++ b/demo/src/main/res/layout/recyclerview.xml
@@ -0,0 +1,7 @@
+
+
+
\ No newline at end of file
diff --git a/demo/src/main/res/layout/recyclerview_item.xml b/demo/src/main/res/layout/recyclerview_item.xml
new file mode 100644
index 0000000..43fca02
--- /dev/null
+++ b/demo/src/main/res/layout/recyclerview_item.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/src/main/res/menu/my.xml b/demo/src/main/res/menu/my.xml
index 087d48c..df54633 100644
--- a/demo/src/main/res/menu/my.xml
+++ b/demo/src/main/res/menu/my.xml
@@ -1,14 +1,19 @@
diff --git a/gradle.properties b/gradle.properties
index f6b05d2..17eac85 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -18,11 +18,11 @@
# org.gradle.parallel=true
-VERSION_NAME=1.1.7
-VERSION_CODE=18
+VERSION_NAME=1.1.8
+VERSION_CODE=20
GROUP=com.daimajia.swipelayout
ANDROID_BUILD_MIN_SDK_VERSION=8
-ANDROID_BUILD_TARGET_SDK_VERSION=20
-ANDROID_BUILD_SDK_VERSION=20
-ANDROID_BUILD_TOOLS_VERSION=20.0.0
+ANDROID_BUILD_TARGET_SDK_VERSION=21
+ANDROID_BUILD_SDK_VERSION=21
+ANDROID_BUILD_TOOLS_VERSION=21.0.0
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 1e61d1f..af3deba 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.2.1-all.zip
\ No newline at end of file
diff --git a/library/build.gradle b/library/build.gradle
index 7a17821..b2a64c1 100644
--- a/library/build.gradle
+++ b/library/build.gradle
@@ -5,13 +5,13 @@ android {
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
defaultConfig {
- applicationId "com.daimajia.swipe"
minSdkVersion 8
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
}
}
dependencies {
- compile 'com.android.support:support-v4:20.+'
+ compile 'com.android.support:recyclerview-v7:21.0.0'
+ compile 'com.android.support:support-v4:21.0.3'
}
apply from: './gradle-mvn-push.gradle'
\ No newline at end of file
diff --git a/library/src/main/java/com/daimajia/swipe/SwipeLayout.java b/library/src/main/java/com/daimajia/swipe/SwipeLayout.java
index f8199be..4232a96 100644
--- a/library/src/main/java/com/daimajia/swipe/SwipeLayout.java
+++ b/library/src/main/java/com/daimajia/swipe/SwipeLayout.java
@@ -822,22 +822,8 @@ public class SwipeLayout extends FrameLayout {
sY = event.getRawY();
if (touching != null) touching.setPressed(true);
-
return true;
- case MotionEvent.ACTION_MOVE: {
- if (sX == -1 || sY == -1) {
- // Trick:
- // When in nested mode, we need to send a constructed
- // ACTION_DOWN MotionEvent to mDragHelper, to help
- // it initialize itself.
- event.setAction(MotionEvent.ACTION_DOWN);
- mDragHelper.processTouchEvent(event);
- parent.requestDisallowInterceptTouchEvent(true);
- sX = event.getRawX();
- sY = event.getRawY();
- return true;
- }
-
+ case MotionEvent.ACTION_MOVE:{
float distanceX = event.getRawX() - sX;
float distanceY = event.getRawY() - sY;
float angle = Math.abs(distanceY / distanceX);
diff --git a/library/src/main/java/com/daimajia/swipe/SwipeLayout.java.orig b/library/src/main/java/com/daimajia/swipe/SwipeLayout.java.orig
new file mode 100644
index 0000000..9a55eb7
--- /dev/null
+++ b/library/src/main/java/com/daimajia/swipe/SwipeLayout.java.orig
@@ -0,0 +1,1512 @@
+package com.daimajia.swipe;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Rect;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.widget.ViewDragHelper;
+import android.util.AttributeSet;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.widget.Adapter;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.FrameLayout;
+import android.widget.ListAdapter;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SwipeLayout extends FrameLayout {
+
+ private static final int DRAG_LEFT = 1;
+ private static final int DRAG_RIGHT = 2;
+ private static final int DRAG_TOP = 4;
+ private static final int DRAG_BOTTOM = 8;
+
+ private int mTouchSlop;
+
+ private int mLeftIndex;
+ private int mRightIndex;
+ private int mTopIndex;
+ private int mBottomIndex;
+
+ private int currentDirectionIndex = 0;
+ private ViewDragHelper mDragHelper;
+
+ private int mDragDistance = 0;
+ private List mDragEdges;
+ private ShowMode mShowMode;
+
+ private float mLeftEdgeSwipeOffset;
+ private float mRightEdgeSwipeOffset;
+ private float mTopEdgeSwipeOffset;
+ private float mBottomEdgeSwipeOffset;
+
+ private Map mBottomViewIdMap = new HashMap();
+ private boolean mBottomViewIdsSet = false;
+
+ private List mSwipeListeners = new ArrayList();
+ private List mSwipeDeniers = new ArrayList();
+ private Map> mRevealListeners = new HashMap>();
+ private Map mShowEntirely = new HashMap();
+
+ private DoubleClickListener mDoubleClickListener;
+
+ private boolean mSwipeEnabled = true;
+
+ public static enum DragEdge {
+ Left,
+ Right,
+ Top,
+ Bottom;
+ }
+
+ ;
+
+ public static enum ShowMode {
+ LayDown,
+ PullOut
+ }
+
+ public SwipeLayout(Context context) {
+ this(context, null);
+ }
+
+ public SwipeLayout(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public SwipeLayout(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ mDragHelper = ViewDragHelper.create(this, mDragHelperCallback);
+ mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SwipeLayout);
+ int dragEdgeChoices = a.getInt(R.styleable.SwipeLayout_drag_edge, DRAG_RIGHT);
+ mLeftEdgeSwipeOffset = a.getDimension(R.styleable.SwipeLayout_leftEdgeSwipeOffset, 0);
+ mRightEdgeSwipeOffset = a.getDimension(R.styleable.SwipeLayout_rightEdgeSwipeOffset, 0);
+ mTopEdgeSwipeOffset = a.getDimension(R.styleable.SwipeLayout_topEdgeSwipeOffset, 0);
+ mBottomEdgeSwipeOffset = a.getDimension(R.styleable.SwipeLayout_bottomEdgeSwipeOffset, 0);
+
+ mDragEdges = new ArrayList();
+ if ((dragEdgeChoices & DRAG_LEFT) == DRAG_LEFT) {
+ mDragEdges.add(DragEdge.Left);
+ }
+ if ((dragEdgeChoices & DRAG_RIGHT) == DRAG_RIGHT) {
+ mDragEdges.add(DragEdge.Right);
+ }
+ if ((dragEdgeChoices & DRAG_TOP) == DRAG_TOP) {
+ mDragEdges.add(DragEdge.Top);
+ }
+ if ((dragEdgeChoices & DRAG_BOTTOM) == DRAG_BOTTOM) {
+ mDragEdges.add(DragEdge.Bottom);
+ }
+ populateIndexes();
+ int ordinal = a.getInt(R.styleable.SwipeLayout_show_mode, ShowMode.PullOut.ordinal());
+ mShowMode = ShowMode.values()[ordinal];
+ }
+
+ public interface SwipeListener {
+ public void onStartOpen(SwipeLayout layout);
+
+ public void onOpen(SwipeLayout layout);
+
+ public void onStartClose(SwipeLayout layout);
+
+ public void onClose(SwipeLayout layout);
+
+ public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset);
+
+ public void onHandRelease(SwipeLayout layout, float xvel, float yvel);
+ }
+
+ public void addSwipeListener(SwipeListener l) {
+ mSwipeListeners.add(l);
+ }
+
+ public void removeSwipeListener(SwipeListener l) {
+ mSwipeListeners.remove(l);
+ }
+
+ public static interface SwipeDenier {
+ /*
+ * Called in onInterceptTouchEvent Determines if this swipe event should
+ * be denied Implement this interface if you are using views with swipe
+ * gestures As a child of SwipeLayout
+ *
+ * @return true deny false allow
+ */
+ public boolean shouldDenySwipe(MotionEvent ev);
+ }
+
+ public void addSwipeDenier(SwipeDenier denier) {
+ mSwipeDeniers.add(denier);
+ }
+
+ public void removeSwipeDenier(SwipeDenier denier) {
+ mSwipeDeniers.remove(denier);
+ }
+
+ public void removeAllSwipeDeniers() {
+ mSwipeDeniers.clear();
+ }
+
+ public interface OnRevealListener {
+ public void onReveal(View child, DragEdge edge, float fraction, int distance);
+ }
+
+ /**
+ * bind a view with a specific
+ * {@link com.daimajia.swipe.SwipeLayout.OnRevealListener}
+ *
+ * @param childId the view id.
+ * @param l the target
+ * {@link com.daimajia.swipe.SwipeLayout.OnRevealListener}
+ */
+ public void addRevealListener(int childId, OnRevealListener l) {
+ View child = findViewById(childId);
+ if (child == null) {
+ throw new IllegalArgumentException("Child does not belong to SwipeListener.");
+ }
+
+ if (!mShowEntirely.containsKey(child)) {
+ mShowEntirely.put(child, false);
+ }
+ if (mRevealListeners.get(child) == null)
+ mRevealListeners.put(child, new ArrayList());
+
+ mRevealListeners.get(child).add(l);
+ }
+
+ /**
+ * bind multiple views with an
+ * {@link com.daimajia.swipe.SwipeLayout.OnRevealListener}.
+ *
+ * @param childIds the view id.
+ * @param l the {@link com.daimajia.swipe.SwipeLayout.OnRevealListener}
+ */
+ public void addRevealListener(int[] childIds, OnRevealListener l) {
+ for (int i : childIds)
+ addRevealListener(i, l);
+ }
+
+ public void removeRevealListener(int childId, OnRevealListener l) {
+ View child = findViewById(childId);
+
+ if (child == null) return;
+
+ mShowEntirely.remove(child);
+ if (mRevealListeners.containsKey(child)) mRevealListeners.get(child).remove(l);
+ }
+
+ public void removeAllRevealListeners(int childId) {
+ View child = findViewById(childId);
+ if (child != null) {
+ mRevealListeners.remove(child);
+ mShowEntirely.remove(child);
+ }
+ }
+
+ private ViewDragHelper.Callback mDragHelperCallback = new ViewDragHelper.Callback() {
+
+ @Override
+ public int clampViewPositionHorizontal(View child, int left, int dx) {
+ if (child == getSurfaceView()) {
+ switch (mDragEdges.get(currentDirectionIndex)) {
+ case Top:
+ case Bottom:
+ return getPaddingLeft();
+ case Left:
+ if (left < getPaddingLeft()) return getPaddingLeft();
+ if (left > getPaddingLeft() + mDragDistance)
+ return getPaddingLeft() + mDragDistance;
+ break;
+ case Right:
+ if (left > getPaddingLeft()) return getPaddingLeft();
+ if (left < getPaddingLeft() - mDragDistance)
+ return getPaddingLeft() - mDragDistance;
+ break;
+ }
+ } else if (getBottomViews().get(currentDirectionIndex) == child) {
+
+ switch (mDragEdges.get(currentDirectionIndex)) {
+ case Top:
+ case Bottom:
+ return getPaddingLeft();
+ case Left:
+ if (mShowMode == ShowMode.PullOut) {
+ if (left > getPaddingLeft()) return getPaddingLeft();
+ }
+ break;
+ case Right:
+ if (mShowMode == ShowMode.PullOut) {
+ if (left < getMeasuredWidth() - mDragDistance) {
+ return getMeasuredWidth() - mDragDistance;
+ }
+ }
+ break;
+ }
+ }
+ return left;
+ }
+
+ @Override
+ public int clampViewPositionVertical(View child, int top, int dy) {
+ if (child == getSurfaceView()) {
+ switch (mDragEdges.get(currentDirectionIndex)) {
+ case Left:
+ case Right:
+ return getPaddingTop();
+ case Top:
+ if (top < getPaddingTop()) return getPaddingTop();
+ if (top > getPaddingTop() + mDragDistance)
+ return getPaddingTop() + mDragDistance;
+ break;
+ case Bottom:
+ if (top < getPaddingTop() - mDragDistance) {
+ return getPaddingTop() - mDragDistance;
+ }
+ if (top > getPaddingTop()) {
+ return getPaddingTop();
+ }
+ }
+ } else {
+ switch (mDragEdges.get(currentDirectionIndex)) {
+ case Left:
+ case Right:
+ return getPaddingTop();
+ case Top:
+ if (mShowMode == ShowMode.PullOut) {
+ if (top > getPaddingTop()) return getPaddingTop();
+ } else {
+ if (getSurfaceView().getTop() + dy < getPaddingTop())
+ return getPaddingTop();
+ if (getSurfaceView().getTop() + dy > getPaddingTop() + mDragDistance)
+ return getPaddingTop() + mDragDistance;
+ }
+ break;
+ case Bottom:
+ if (mShowMode == ShowMode.PullOut) {
+ if (top < getMeasuredHeight() - mDragDistance)
+ return getMeasuredHeight() - mDragDistance;
+ } else {
+ if (getSurfaceView().getTop() + dy >= getPaddingTop())
+ return getPaddingTop();
+ if (getSurfaceView().getTop() + dy <= getPaddingTop() - mDragDistance)
+ return getPaddingTop() - mDragDistance;
+ }
+ }
+ }
+ return top;
+ }
+
+ @Override
+ public boolean tryCaptureView(View child, int pointerId) {
+ return child == getSurfaceView() || getBottomViews().contains(child);
+ }
+
+ @Override
+ public int getViewHorizontalDragRange(View child) {
+ return mDragDistance;
+ }
+
+ @Override
+ public int getViewVerticalDragRange(View child) {
+ return mDragDistance;
+ }
+
+ @Override
+ public void onViewReleased(View releasedChild, float xvel, float yvel) {
+ super.onViewReleased(releasedChild, xvel, yvel);
+ for (SwipeListener l : mSwipeListeners)
+ l.onHandRelease(SwipeLayout.this, xvel, yvel);
+ if (releasedChild == getSurfaceView()) {
+ processSurfaceRelease(xvel, yvel);
+ } else if (getBottomViews().contains(releasedChild)) {
+ if (getShowMode() == ShowMode.PullOut) {
+ processBottomPullOutRelease(xvel, yvel);
+ } else if (getShowMode() == ShowMode.LayDown) {
+ processBottomLayDownMode(xvel, yvel);
+ }
+ }
+
+ invalidate();
+ }
+
+ @Override
+ public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
+ int evLeft = getSurfaceView().getLeft(), evRight = getSurfaceView().getRight(), evTop = getSurfaceView()
+ .getTop(), evBottom = getSurfaceView().getBottom();
+ if (changedView == getSurfaceView()) {
+
+ if (mShowMode == ShowMode.PullOut) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left
+ || mDragEdges.get(currentDirectionIndex) == DragEdge.Right)
+ getBottomViews().get(currentDirectionIndex).offsetLeftAndRight(dx);
+ else getBottomViews().get(currentDirectionIndex).offsetTopAndBottom(dy);
+ }
+
+ } else if (getBottomViews().contains(changedView)) {
+
+ if (mShowMode == ShowMode.PullOut) {
+ getSurfaceView().offsetLeftAndRight(dx);
+ getSurfaceView().offsetTopAndBottom(dy);
+ } else {
+ Rect rect = computeBottomLayDown(mDragEdges.get(currentDirectionIndex));
+ getBottomViews().get(currentDirectionIndex).layout(rect.left, rect.top, rect.right, rect.bottom);
+
+ int newLeft = getSurfaceView().getLeft() + dx, newTop = getSurfaceView().getTop() + dy;
+
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left && newLeft < getPaddingLeft())
+ newLeft = getPaddingLeft();
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Right && newLeft > getPaddingLeft())
+ newLeft = getPaddingLeft();
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Top && newTop < getPaddingTop())
+ newTop = getPaddingTop();
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Bottom && newTop > getPaddingTop())
+ newTop = getPaddingTop();
+
+ getSurfaceView()
+ .layout(newLeft, newTop, newLeft + getMeasuredWidth(), newTop + getMeasuredHeight());
+ }
+ }
+
+ dispatchRevealEvent(evLeft, evTop, evRight, evBottom);
+
+ dispatchSwipeEvent(evLeft, evTop, dx, dy);
+
+ invalidate();
+ }
+ };
+
+ /**
+ * the dispatchRevealEvent method may not always get accurate position, it
+ * makes the view may not always get the event when the view is totally
+ * show( fraction = 1), so , we need to calculate every time.
+ *
+ * @param child
+ * @param relativePosition
+ * @param edge
+ * @param surfaceLeft
+ * @param surfaceTop
+ * @param surfaceRight
+ * @param surfaceBottom
+ * @return
+ */
+ protected boolean isViewTotallyFirstShowed(View child, Rect relativePosition, DragEdge edge, int surfaceLeft,
+ int surfaceTop, int surfaceRight, int surfaceBottom) {
+ if (mShowEntirely.get(child)) return false;
+ int childLeft = relativePosition.left;
+ int childRight = relativePosition.right;
+ int childTop = relativePosition.top;
+ int childBottom = relativePosition.bottom;
+ boolean r = false;
+ if (getShowMode() == ShowMode.LayDown) {
+ if ((edge == DragEdge.Right && surfaceRight <= childLeft)
+ || (edge == DragEdge.Left && surfaceLeft >= childRight)
+ || (edge == DragEdge.Top && surfaceTop >= childBottom)
+ || (edge == DragEdge.Bottom && surfaceBottom <= childTop)) r = true;
+ } else if (getShowMode() == ShowMode.PullOut) {
+ if ((edge == DragEdge.Right && childRight <= getWidth())
+ || (edge == DragEdge.Left && childLeft >= getPaddingLeft())
+ || (edge == DragEdge.Top && childTop >= getPaddingTop())
+ || (edge == DragEdge.Bottom && childBottom <= getHeight())) r = true;
+ }
+ return r;
+ }
+
+ protected boolean isViewShowing(View child, Rect relativePosition, DragEdge availableEdge, int surfaceLeft,
+ int surfaceTop, int surfaceRight, int surfaceBottom) {
+ int childLeft = relativePosition.left;
+ int childRight = relativePosition.right;
+ int childTop = relativePosition.top;
+ int childBottom = relativePosition.bottom;
+ if (getShowMode() == ShowMode.LayDown) {
+ switch (availableEdge) {
+ case Right:
+ if (surfaceRight > childLeft && surfaceRight <= childRight) {
+ return true;
+ }
+ break;
+ case Left:
+ if (surfaceLeft < childRight && surfaceLeft >= childLeft) {
+ return true;
+ }
+ break;
+ case Top:
+ if (surfaceTop >= childTop && surfaceTop < childBottom) {
+ return true;
+ }
+ break;
+ case Bottom:
+ if (surfaceBottom > childTop && surfaceBottom <= childBottom) {
+ return true;
+ }
+ break;
+ }
+ } else if (getShowMode() == ShowMode.PullOut) {
+ switch (availableEdge) {
+ case Right:
+ if (childLeft <= getWidth() && childRight > getWidth()) return true;
+ break;
+ case Left:
+ if (childRight >= getPaddingLeft() && childLeft < getPaddingLeft()) return true;
+ break;
+ case Top:
+ if (childTop < getPaddingTop() && childBottom >= getPaddingTop()) return true;
+ break;
+ case Bottom:
+ if (childTop < getHeight() && childTop >= getPaddingTop()) return true;
+ break;
+ }
+ }
+ return false;
+ }
+
+ protected Rect getRelativePosition(View child) {
+ View t = child;
+ Rect r = new Rect(t.getLeft(), t.getTop(), 0, 0);
+ while (t.getParent() != null && t != getRootView()) {
+ t = (View) t.getParent();
+ if (t == this) break;
+ r.left += t.getLeft();
+ r.top += t.getTop();
+ }
+ r.right = r.left + child.getMeasuredWidth();
+ r.bottom = r.top + child.getMeasuredHeight();
+ return r;
+ }
+
+ private int mEventCounter = 0;
+
+ protected void dispatchSwipeEvent(int surfaceLeft, int surfaceTop, int dx, int dy) {
+ DragEdge edge = getDragEdge();
+ boolean open = true;
+ if (edge == DragEdge.Left) {
+ if (dx < 0) open = false;
+ } else if (edge == DragEdge.Right) {
+ if (dx > 0) open = false;
+ } else if (edge == DragEdge.Top) {
+ if (dy < 0) open = false;
+ } else if (edge == DragEdge.Bottom) {
+ if (dy > 0) open = false;
+ }
+
+ dispatchSwipeEvent(surfaceLeft, surfaceTop, open);
+ }
+
+ protected void dispatchSwipeEvent(int surfaceLeft, int surfaceTop, boolean open) {
+ safeBottomView();
+ Status status = getOpenStatus();
+
+ if (!mSwipeListeners.isEmpty()) {
+ mEventCounter++;
+ for (SwipeListener l : mSwipeListeners) {
+ if (mEventCounter == 1) {
+ if (open) {
+ l.onStartOpen(this);
+ } else {
+ l.onStartClose(this);
+ }
+ }
+ l.onUpdate(SwipeLayout.this, surfaceLeft - getPaddingLeft(), surfaceTop - getPaddingTop());
+ }
+
+ if (status == Status.Close) {
+ for (SwipeListener l : mSwipeListeners) {
+ l.onClose(SwipeLayout.this);
+ }
+ mEventCounter = 0;
+ }
+
+ if (status == Status.Open) {
+ getBottomViews().get(currentDirectionIndex).setEnabled(true);
+ for (SwipeListener l : mSwipeListeners) {
+ l.onOpen(SwipeLayout.this);
+ }
+ mEventCounter = 0;
+ }
+ }
+ }
+
+ /**
+ * prevent bottom view get any touch event. Especially in LayDown mode.
+ */
+ private void safeBottomView() {
+ Status status = getOpenStatus();
+ List bottoms = getBottomViews();
+
+ if (status == Status.Close) {
+ for (ViewGroup bottom : bottoms) {
+ if (bottom.getVisibility() != INVISIBLE) bottom.setVisibility(INVISIBLE);
+ }
+ } else {
+ if (bottoms.get(currentDirectionIndex).getVisibility() != VISIBLE)
+ bottoms.get(currentDirectionIndex).setVisibility(VISIBLE);
+ }
+ }
+
+ protected void dispatchRevealEvent(final int surfaceLeft, final int surfaceTop, final int surfaceRight,
+ final int surfaceBottom) {
+ if (mRevealListeners.isEmpty()) return;
+ for (Map.Entry> entry : mRevealListeners.entrySet()) {
+ View child = entry.getKey();
+ Rect rect = getRelativePosition(child);
+ if (isViewShowing(child, rect, mDragEdges.get(currentDirectionIndex), surfaceLeft, surfaceTop,
+ surfaceRight, surfaceBottom)) {
+ mShowEntirely.put(child, false);
+ int distance = 0;
+ float fraction = 0f;
+ if (getShowMode() == ShowMode.LayDown) {
+ switch (mDragEdges.get(currentDirectionIndex)) {
+ case Left:
+ distance = rect.left - surfaceLeft;
+ fraction = distance / (float) child.getWidth();
+ break;
+ case Right:
+ distance = rect.right - surfaceRight;
+ fraction = distance / (float) child.getWidth();
+ break;
+ case Top:
+ distance = rect.top - surfaceTop;
+ fraction = distance / (float) child.getHeight();
+ break;
+ case Bottom:
+ distance = rect.bottom - surfaceBottom;
+ fraction = distance / (float) child.getHeight();
+ break;
+ }
+ } else if (getShowMode() == ShowMode.PullOut) {
+ switch (mDragEdges.get(currentDirectionIndex)) {
+ case Left:
+ distance = rect.right - getPaddingLeft();
+ fraction = distance / (float) child.getWidth();
+ break;
+ case Right:
+ distance = rect.left - getWidth();
+ fraction = distance / (float) child.getWidth();
+ break;
+ case Top:
+ distance = rect.bottom - getPaddingTop();
+ fraction = distance / (float) child.getHeight();
+ break;
+ case Bottom:
+ distance = rect.top - getHeight();
+ fraction = distance / (float) child.getHeight();
+ break;
+ }
+ }
+
+ for (OnRevealListener l : entry.getValue()) {
+ l.onReveal(child, mDragEdges.get(currentDirectionIndex), Math.abs(fraction), distance);
+ if (Math.abs(fraction) == 1) {
+ mShowEntirely.put(child, true);
+ }
+ }
+ }
+
+ if (isViewTotallyFirstShowed(child, rect, mDragEdges.get(currentDirectionIndex), surfaceLeft, surfaceTop,
+ surfaceRight, surfaceBottom)) {
+ mShowEntirely.put(child, true);
+ for (OnRevealListener l : entry.getValue()) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left
+ || mDragEdges.get(currentDirectionIndex) == DragEdge.Right)
+ l.onReveal(child, mDragEdges.get(currentDirectionIndex), 1, child.getWidth());
+ else
+ l.onReveal(child, mDragEdges.get(currentDirectionIndex), 1, child.getHeight());
+ }
+ }
+
+ }
+ }
+
+ @Override
+ public void computeScroll() {
+ super.computeScroll();
+ if (mDragHelper.continueSettling(true)) {
+ ViewCompat.postInvalidateOnAnimation(this);
+ }
+ }
+
+ /**
+ * {@link android.view.View.OnLayoutChangeListener} added in API 11. I need
+ * to support it from API 8.
+ */
+ public interface OnLayout {
+ public void onLayout(SwipeLayout v);
+ }
+
+ private List mOnLayoutListeners;
+
+ public void addOnLayoutListener(OnLayout l) {
+ if (mOnLayoutListeners == null) mOnLayoutListeners = new ArrayList();
+ mOnLayoutListeners.add(l);
+ }
+
+ public void removeOnLayoutListener(OnLayout l) {
+ if (mOnLayoutListeners != null) mOnLayoutListeners.remove(l);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ int childCount = getChildCount();
+ if (childCount != 1 + mDragEdges.size()) {
+ throw new IllegalStateException("You need to have one surface view plus one view for each of your drag edges");
+ }
+ for (int i = 0; i < childCount; i++) {
+ if (!(getChildAt(i) instanceof ViewGroup)) {
+ throw new IllegalArgumentException("All the children in SwipeLayout must be an instance of ViewGroup");
+ }
+ }
+
+ if (mShowMode == ShowMode.PullOut)
+ layoutPullOut();
+ else if (mShowMode == ShowMode.LayDown) layoutLayDown();
+
+ safeBottomView();
+
+ if (mOnLayoutListeners != null) for (int i = 0; i < mOnLayoutListeners.size(); i++) {
+ mOnLayoutListeners.get(i).onLayout(this);
+ }
+
+ }
+
+ void layoutPullOut() {
+ Rect rect = computeSurfaceLayoutArea(false);
+ getSurfaceView().layout(rect.left, rect.top, rect.right, rect.bottom);
+ rect = computeBottomLayoutAreaViaSurface(ShowMode.PullOut, rect);
+ getBottomViews().get(currentDirectionIndex).layout(rect.left, rect.top, rect.right, rect.bottom);
+ bringChildToFront(getSurfaceView());
+ }
+
+ void layoutLayDown() {
+ Rect rect = computeSurfaceLayoutArea(false);
+ getSurfaceView().layout(rect.left, rect.top, rect.right, rect.bottom);
+ rect = computeBottomLayoutAreaViaSurface(ShowMode.LayDown, rect);
+ getBottomViews().get(currentDirectionIndex).layout(rect.left, rect.top, rect.right, rect.bottom);
+ bringChildToFront(getSurfaceView());
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left
+ || mDragEdges.get(currentDirectionIndex) == DragEdge.Right)
+ mDragDistance = getBottomViews().get(currentDirectionIndex).getMeasuredWidth()
+ - dp2px(getCurrentOffset());
+ else mDragDistance = getBottomViews().get(currentDirectionIndex).getMeasuredHeight()
+ - dp2px(getCurrentOffset());
+ }
+
+ private boolean mTouchConsumedByChild = false;
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+
+ if (!isEnabled() || !isEnabledInAdapterView()) {
+ return true;
+ }
+
+ if (!isSwipeEnabled()) {
+ return false;
+ }
+
+ for (SwipeDenier denier : mSwipeDeniers) {
+ if (denier != null && denier.shouldDenySwipe(ev)) {
+ return false;
+ }
+ }
+ //
+ // if a child wants to handle the touch event,
+ // then let it do it.
+ //
+ int action = ev.getActionMasked();
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ Status status = getOpenStatus();
+ if (status == Status.Close) {
+ mTouchConsumedByChild = childNeedHandleTouchEvent(getSurfaceView(), ev) != null;
+ } else if (status == Status.Open) {
+ mTouchConsumedByChild = childNeedHandleTouchEvent(getBottomViews().get(currentDirectionIndex), ev) != null;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ mTouchConsumedByChild = false;
+ }
+
+ if (mTouchConsumedByChild) return false;
+ return mDragHelper.shouldInterceptTouchEvent(ev);
+ }
+
+ /**
+ * if the ViewGroup children want to handle this event.
+ *
+ * @param v
+ * @param event
+ * @return
+ */
+ private View childNeedHandleTouchEvent(ViewGroup v, MotionEvent event) {
+ if (v == null) return null;
+ if (v.onTouchEvent(event)) return v;
+
+ int childCount = v.getChildCount();
+ for (int i = childCount - 1; i >= 0; i--) {
+ View child = v.getChildAt(i);
+ if (child instanceof ViewGroup) {
+ View grandChild = childNeedHandleTouchEvent((ViewGroup) child, event);
+ if (grandChild != null) return grandChild;
+ } else {
+ if (childNeedHandleTouchEvent(v.getChildAt(i), event)) return v.getChildAt(i);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * if the view (v) wants to handle this event.
+ *
+ * @param v
+ * @param event
+ * @return
+ */
+ private boolean childNeedHandleTouchEvent(View v, MotionEvent event) {
+ if (v == null) return false;
+
+ int[] loc = new int[2];
+ v.getLocationOnScreen(loc);
+ int left = loc[0], top = loc[1];
+
+ if (event.getRawX() > left && event.getRawX() < left + v.getWidth() && event.getRawY() > top
+ && event.getRawY() < top + v.getHeight()) {
+ return v.onTouchEvent(event);
+ }
+
+ return false;
+ }
+
+ private float sX = -1, sY = -1;
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (!isEnabledInAdapterView() || !isEnabled()) return true;
+
+ if (!isSwipeEnabled()) return super.onTouchEvent(event);
+
+ int action = event.getActionMasked();
+ ViewParent parent = getParent();
+
+ gestureDetector.onTouchEvent(event);
+ Status status = getOpenStatus();
+ ViewGroup touching = null;
+ if (status == Status.Close) {
+ touching = getSurfaceView();
+ } else if (status == Status.Open) {
+ touching = getBottomViews().get(currentDirectionIndex);
+ }
+
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ mDragHelper.processTouchEvent(event);
+ parent.requestDisallowInterceptTouchEvent(true);
+
+ sX = event.getRawX();
+ sY = event.getRawY();
+
+<<<<<<< HEAD
+ if (touching != null) touching.setPressed(true);
+
+ return true;
+ case MotionEvent.ACTION_MOVE: {
+ if (sX == -1 || sY == -1) {
+ // Trick:
+ // When in nested mode, we need to send a constructed
+ // ACTION_DOWN MotionEvent to mDragHelper, to help
+ // it initialize itself.
+ event.setAction(MotionEvent.ACTION_DOWN);
+ mDragHelper.processTouchEvent(event);
+ parent.requestDisallowInterceptTouchEvent(true);
+ sX = event.getRawX();
+ sY = event.getRawY();
+ return true;
+ }
+
+=======
+ if(touching != null)
+ touching.setPressed(true);
+ return true;
+ case MotionEvent.ACTION_MOVE:{
+>>>>>>> upstream/master
+ float distanceX = event.getRawX() - sX;
+ float distanceY = event.getRawY() - sY;
+ float angle = Math.abs(distanceY / distanceX);
+ angle = (float) Math.toDegrees(Math.atan(angle));
+ if (getOpenStatus() == Status.Close) {
+ int lastCurrentDirectionIndex = currentDirectionIndex;
+ if (angle < 45) {
+ if (mLeftIndex != -1 && distanceX > 0) {
+ currentDirectionIndex = mLeftIndex;
+ } else if (mRightIndex != -1) {
+ currentDirectionIndex = mRightIndex;
+ }
+ } else {
+ if (mTopIndex != -1 && distanceY < 0) {
+ currentDirectionIndex = mTopIndex;
+ } else if (mBottomIndex != -1) {
+ currentDirectionIndex = mBottomIndex;
+ }
+ }
+ if (lastCurrentDirectionIndex != currentDirectionIndex) {
+ updateBottomViews();
+ }
+ }
+
+ boolean doNothing = false;
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Right) {
+ boolean suitable = (status == Status.Open && distanceX > mTouchSlop)
+ || (status == Status.Close && distanceX < -mTouchSlop);
+ suitable = suitable || (status == Status.Middle);
+
+ if (angle > 30 || !suitable) {
+ doNothing = true;
+ }
+ }
+
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left) {
+ boolean suitable = (status == Status.Open && distanceX < -mTouchSlop)
+ || (status == Status.Close && distanceX > mTouchSlop);
+ suitable = suitable || status == Status.Middle;
+
+ if (angle > 30 || !suitable) {
+ doNothing = true;
+ }
+ }
+
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Top) {
+ boolean suitable = (status == Status.Open && distanceY < -mTouchSlop)
+ || (status == Status.Close && distanceY > mTouchSlop);
+ suitable = suitable || status == Status.Middle;
+
+ if (angle < 60 || !suitable) {
+ doNothing = true;
+ }
+ }
+
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Bottom) {
+ boolean suitable = (status == Status.Open && distanceY > mTouchSlop)
+ || (status == Status.Close && distanceY < -mTouchSlop);
+ suitable = suitable || status == Status.Middle;
+
+ if (angle < 60 || !suitable) {
+ doNothing = true;
+ }
+ }
+
+ if (doNothing) {
+ parent.requestDisallowInterceptTouchEvent(false);
+ return false;
+ } else {
+ if (touching != null) {
+ touching.setPressed(false);
+ }
+ parent.requestDisallowInterceptTouchEvent(true);
+ mDragHelper.processTouchEvent(event);
+ }
+ break;
+ }
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL: {
+ sX = -1;
+ sY = -1;
+ if (touching != null) {
+ touching.setPressed(false);
+ }
+ }
+ default:
+ parent.requestDisallowInterceptTouchEvent(true);
+ mDragHelper.processTouchEvent(event);
+ }
+
+ return true;
+ }
+
+ /**
+ * if working in {@link android.widget.AdapterView}, we should response
+ * {@link android.widget.Adapter} isEnable(int position).
+ *
+ * @return true when item is enabled, else disabled.
+ */
+ private boolean isEnabledInAdapterView() {
+ AdapterView adapterView = getAdapterView();
+ boolean enable = true;
+ if (adapterView != null) {
+ Adapter adapter = adapterView.getAdapter();
+ if (adapter != null) {
+ int p = adapterView.getPositionForView(SwipeLayout.this);
+ if (adapter instanceof BaseAdapter) {
+ enable = ((BaseAdapter) adapter).isEnabled(p);
+ } else if (adapter instanceof ListAdapter) {
+ enable = ((ListAdapter) adapter).isEnabled(p);
+ }
+ }
+ }
+ return enable;
+ }
+
+ public void setSwipeEnabled(boolean enabled) {
+ mSwipeEnabled = enabled;
+ }
+
+ public boolean isSwipeEnabled() {
+ return mSwipeEnabled;
+ }
+
+ private boolean insideAdapterView() {
+ return getAdapterView() != null;
+ }
+
+ private AdapterView getAdapterView() {
+ ViewParent t = getParent();
+ while (t != null) {
+ if (t instanceof AdapterView) {
+ return (AdapterView) t;
+ }
+ t = t.getParent();
+ }
+ return null;
+ }
+
+ private void performAdapterViewItemClick(MotionEvent e) {
+ ViewParent t = getParent();
+ while (t != null) {
+ if (t instanceof AdapterView) {
+ AdapterView view = (AdapterView) t;
+ int p = view.getPositionForView(SwipeLayout.this);
+ if (p != AdapterView.INVALID_POSITION
+ && view.performItemClick(view.getChildAt(p - view.getFirstVisiblePosition()), p, view
+ .getAdapter().getItemId(p))) return;
+ } else {
+ if (t instanceof View && ((View) t).performClick()) return;
+ }
+ t = t.getParent();
+ }
+ }
+
+ private GestureDetector gestureDetector = new GestureDetector(getContext(), new SwipeDetector());
+
+ class SwipeDetector extends GestureDetector.SimpleOnGestureListener {
+ @Override
+ public boolean onDown(MotionEvent e) {
+ return true;
+ }
+
+ /**
+ * Simulate the touch event lifecycle. If you use SwipeLayout in
+ * {@link android.widget.AdapterView} ({@link android.widget.ListView},
+ * {@link android.widget.GridView} etc.) It will manually call
+ * {@link android.widget.AdapterView}.performItemClick,
+ * performItemLongClick.
+ *
+ * @param e
+ * @return
+ */
+ @Override
+ public boolean onSingleTapUp(MotionEvent e) {
+ if (mDoubleClickListener == null) {
+ performAdapterViewItemClick(e);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onSingleTapConfirmed(MotionEvent e) {
+ if (mDoubleClickListener != null) {
+ performAdapterViewItemClick(e);
+ }
+ return true;
+ }
+
+ @Override
+ public void onLongPress(MotionEvent e) {
+ performLongClick();
+ }
+
+ @Override
+ public boolean onDoubleTap(MotionEvent e) {
+ if (mDoubleClickListener != null) {
+ View target;
+ ViewGroup bottom = getBottomViews().get(currentDirectionIndex);
+ ViewGroup surface = getSurfaceView();
+ if (e.getX() > bottom.getLeft() && e.getX() < bottom.getRight() && e.getY() > bottom.getTop()
+ && e.getY() < bottom.getBottom()) {
+ target = bottom;
+ } else {
+ target = surface;
+ }
+ mDoubleClickListener.onDoubleClick(SwipeLayout.this, target == surface);
+ }
+ return true;
+ }
+ }
+
+ public void setDragEdge(DragEdge dragEdge) {
+ mDragEdges = new ArrayList();
+ mDragEdges.add(dragEdge);
+ currentDirectionIndex = 0;
+ populateIndexes();
+ requestLayout();
+ updateBottomViews();
+ }
+
+ /**
+ * set the drag distance, it will force set the bottom view's width or
+ * height via this value.
+ *
+ * @param max
+ */
+ public void setDragDistance(int max) {
+ if (max < 0) throw new IllegalArgumentException("Drag distance can not be < 0");
+ mDragDistance = dp2px(max);
+ requestLayout();
+ }
+
+ /**
+ * There are 2 diffirent show mode.
+ * {@link com.daimajia.swipe.SwipeLayout.ShowMode}.PullOut and
+ * {@link com.daimajia.swipe.SwipeLayout.ShowMode}.LayDown.
+ *
+ * @param mode
+ */
+ public void setShowMode(ShowMode mode) {
+ mShowMode = mode;
+ requestLayout();
+ }
+
+ public DragEdge getDragEdge() {
+ return mDragEdges.get(currentDirectionIndex);
+ }
+
+ public int getDragDistance() {
+ return mDragDistance;
+ }
+
+ public ShowMode getShowMode() {
+ return mShowMode;
+ }
+
+ public ViewGroup getSurfaceView() {
+ return (ViewGroup) getChildAt(getChildCount() - 1);
+ }
+
+ public List getBottomViews() {
+ List lvg = new ArrayList();
+ // If the user has provided a map for views to
+ if (mBottomViewIdsSet) {
+ if (mDragEdges.contains(DragEdge.Left)) {
+ lvg.add(mLeftIndex, ((ViewGroup) findViewById(mBottomViewIdMap.get(DragEdge.Left))));
+ }
+ if (mDragEdges.contains(DragEdge.Right)) {
+ lvg.add(mRightIndex, ((ViewGroup) findViewById(mBottomViewIdMap.get(DragEdge.Right))));
+ }
+ if (mDragEdges.contains(DragEdge.Top)) {
+ lvg.add(mTopIndex, ((ViewGroup) findViewById(mBottomViewIdMap.get(DragEdge.Top))));
+ }
+ if (mDragEdges.contains(DragEdge.Bottom)) {
+ lvg.add(mBottomIndex, ((ViewGroup) findViewById(mBottomViewIdMap.get(DragEdge.Bottom))));
+ }
+ }
+ // Default behaviour is to simply use the first n-1 children in the order they're listed in the layout
+ // and return them in
+ else {
+ for (int i = 0; i < (getChildCount() - 1); i++) {
+ lvg.add((ViewGroup) getChildAt(i));
+ }
+ }
+ return lvg;
+ }
+
+ // Pass the id of the view if set, otherwise pass -1
+ public void setBottomViewIds (int left, int right, int top, int bottom) {
+ if (mDragEdges.contains(DragEdge.Left)) {
+ if (left == -1) {
+ mBottomViewIdsSet = false;
+ }
+ else {
+ mBottomViewIdMap.put(DragEdge.Left, left);
+ mBottomViewIdsSet = true;
+ }
+ }
+ if (mDragEdges.contains(DragEdge.Right)) {
+ if (right == -1) {
+ mBottomViewIdsSet = false;
+ }
+ else {
+ mBottomViewIdMap.put(DragEdge.Right, right);
+ mBottomViewIdsSet = true;
+ }
+ }
+ if (mDragEdges.contains(DragEdge.Top)) {
+ if (top == -1) {
+ mBottomViewIdsSet = false;
+ }
+ else {
+ mBottomViewIdMap.put(DragEdge.Top, top);
+ mBottomViewIdsSet = true;
+ }
+ }
+ if (mDragEdges.contains(DragEdge.Bottom)) {
+ if (bottom == -1) {
+ mBottomViewIdsSet = false;
+ }
+ else {
+ mBottomViewIdMap.put(DragEdge.Bottom, bottom);
+ mBottomViewIdsSet = true;
+ }
+ }
+ }
+ public enum Status {
+ Middle,
+ Open,
+ Close
+ }
+
+ /**
+ * get the open status.
+ *
+ * @return {@link com.daimajia.swipe.SwipeLayout.Status} Open , Close or
+ * Middle.
+ */
+ public Status getOpenStatus() {
+ int surfaceLeft = getSurfaceView().getLeft();
+ int surfaceTop = getSurfaceView().getTop();
+ if (surfaceLeft == getPaddingLeft() && surfaceTop == getPaddingTop()) return Status.Close;
+
+ if (surfaceLeft == (getPaddingLeft() - mDragDistance) || surfaceLeft == (getPaddingLeft() + mDragDistance)
+ || surfaceTop == (getPaddingTop() - mDragDistance) || surfaceTop == (getPaddingTop() + mDragDistance))
+ return Status.Open;
+
+ return Status.Middle;
+ }
+
+ /**
+ * Process the surface release event.
+ *
+ * @param xvel
+ * @param yvel
+ */
+ private void processSurfaceRelease(float xvel, float yvel) {
+ if (xvel == 0 && getOpenStatus() == Status.Middle) close();
+
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left
+ || mDragEdges.get(currentDirectionIndex) == DragEdge.Right) {
+ if (xvel > 0) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left)
+ open();
+ else close();
+ }
+ if (xvel < 0) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left)
+ close();
+ else open();
+ }
+ } else {
+ if (yvel > 0) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Top)
+ open();
+ else close();
+ }
+ if (yvel < 0) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Top)
+ close();
+ else open();
+ }
+ }
+ }
+
+ /**
+ * process bottom (PullOut mode) hand release event.
+ *
+ * @param xvel
+ * @param yvel
+ */
+ private void processBottomPullOutRelease(float xvel, float yvel) {
+
+ if (xvel == 0 && getOpenStatus() == Status.Middle) close();
+
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left
+ || mDragEdges.get(currentDirectionIndex) == DragEdge.Right) {
+ if (xvel > 0) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left)
+ open();
+ else close();
+ }
+ if (xvel < 0) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left)
+ close();
+ else open();
+ }
+ } else {
+ if (yvel > 0) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Top)
+ open();
+ else close();
+ }
+
+ if (yvel < 0) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Top)
+ close();
+ else open();
+ }
+ }
+ }
+
+ /**
+ * process bottom (LayDown mode) hand release event.
+ *
+ * @param xvel
+ * @param yvel
+ */
+ private void processBottomLayDownMode(float xvel, float yvel) {
+
+ if (xvel == 0 && getOpenStatus() == Status.Middle) close();
+
+ int l = getPaddingLeft(), t = getPaddingTop();
+
+ if (xvel < 0 && mDragEdges.get(currentDirectionIndex) == DragEdge.Right) l -= mDragDistance;
+ if (xvel > 0 && mDragEdges.get(currentDirectionIndex) == DragEdge.Left) l += mDragDistance;
+
+ if (yvel > 0 && mDragEdges.get(currentDirectionIndex) == DragEdge.Top) t += mDragDistance;
+ if (yvel < 0 && mDragEdges.get(currentDirectionIndex) == DragEdge.Bottom)
+ t -= mDragDistance;
+
+ mDragHelper.smoothSlideViewTo(getSurfaceView(), l, t);
+ invalidate();
+ }
+
+ /**
+ * smoothly open surface.
+ */
+ public void open() {
+ open(true, true);
+ }
+
+ public void open(boolean smooth) {
+ open(smooth, true);
+ }
+
+ public void open(boolean smooth, boolean notify) {
+ ViewGroup surface = getSurfaceView(), bottom = getBottomViews().get(currentDirectionIndex);
+ int dx, dy;
+ Rect rect = computeSurfaceLayoutArea(true);
+ if (smooth) {
+ mDragHelper.smoothSlideViewTo(getSurfaceView(), rect.left, rect.top);
+ } else {
+ dx = rect.left - surface.getLeft();
+ dy = rect.top - surface.getTop();
+ surface.layout(rect.left, rect.top, rect.right, rect.bottom);
+ if (getShowMode() == ShowMode.PullOut) {
+ Rect bRect = computeBottomLayoutAreaViaSurface(ShowMode.PullOut, rect);
+ bottom.layout(bRect.left, bRect.top, bRect.right, bRect.bottom);
+ }
+ if (notify) {
+ dispatchRevealEvent(rect.left, rect.top, rect.right, rect.bottom);
+ dispatchSwipeEvent(rect.left, rect.top, dx, dy);
+ } else {
+ safeBottomView();
+ }
+ }
+ invalidate();
+ }
+
+ /**
+ * smoothly close surface.
+ */
+ public void close() {
+ close(true, true);
+ }
+
+ public void close(boolean smooth) {
+ close(smooth, true);
+ }
+
+ /**
+ * close surface
+ *
+ * @param smooth smoothly or not.
+ * @param notify if notify all the listeners.
+ */
+ public void close(boolean smooth, boolean notify) {
+ ViewGroup surface = getSurfaceView();
+ int dx, dy;
+ if (smooth)
+ mDragHelper.smoothSlideViewTo(getSurfaceView(), getPaddingLeft(), getPaddingTop());
+ else {
+ Rect rect = computeSurfaceLayoutArea(false);
+ dx = rect.left - surface.getLeft();
+ dy = rect.top - surface.getTop();
+ surface.layout(rect.left, rect.top, rect.right, rect.bottom);
+ if (notify) {
+ dispatchRevealEvent(rect.left, rect.top, rect.right, rect.bottom);
+ dispatchSwipeEvent(rect.left, rect.top, dx, dy);
+ } else {
+ safeBottomView();
+ }
+ }
+ invalidate();
+ }
+
+ public void toggle() {
+ toggle(true);
+ }
+
+ public void toggle(boolean smooth) {
+ if (getOpenStatus() == Status.Open)
+ close(smooth);
+ else if (getOpenStatus() == Status.Close) open(smooth);
+ }
+
+ /**
+ * a helper function to compute the Rect area that surface will hold in.
+ *
+ * @param open open status or close status.
+ * @return
+ */
+ private Rect computeSurfaceLayoutArea(boolean open) {
+ int l = getPaddingLeft(), t = getPaddingTop();
+ if (open) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left)
+ l = getPaddingLeft() + mDragDistance;
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Right)
+ l = getPaddingLeft() - mDragDistance;
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Top)
+ t = getPaddingTop() + mDragDistance;
+ else t = getPaddingTop() - mDragDistance;
+ }
+ return new Rect(l, t, l + getMeasuredWidth(), t + getMeasuredHeight());
+ }
+
+ private Rect computeBottomLayoutAreaViaSurface(ShowMode mode, Rect surfaceArea) {
+ Rect rect = surfaceArea;
+
+ int bl = rect.left, bt = rect.top, br = rect.right, bb = rect.bottom;
+ if (mode == ShowMode.PullOut) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left)
+ bl = rect.left - mDragDistance;
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Right)
+ bl = rect.right;
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Top)
+ bt = rect.top - mDragDistance;
+ else bt = rect.bottom;
+
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left || mDragEdges.get(currentDirectionIndex) == DragEdge.Right) {
+ bb = rect.bottom;
+ br = bl + getBottomViews().get(currentDirectionIndex).getMeasuredWidth();
+ } else {
+ bb = bt + getBottomViews().get(currentDirectionIndex).getMeasuredHeight();
+ br = rect.right;
+ }
+ } else if (mode == ShowMode.LayDown) {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left)
+ br = bl + mDragDistance;
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Right)
+ bl = br - mDragDistance;
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Top)
+ bb = bt + mDragDistance;
+ else bt = bb - mDragDistance;
+
+ }
+ return new Rect(bl, bt, br, bb);
+
+ }
+
+ private Rect computeBottomLayDown(DragEdge dragEdge) {
+ int bl = getPaddingLeft(), bt = getPaddingTop();
+ int br, bb;
+ if (dragEdge == DragEdge.Right) {
+ bl = getMeasuredWidth() - mDragDistance;
+ } else if (dragEdge == DragEdge.Bottom) {
+ bt = getMeasuredHeight() - mDragDistance;
+ }
+ if (dragEdge == DragEdge.Left || dragEdge == DragEdge.Right) {
+ br = bl + mDragDistance;
+ bb = bt + getMeasuredHeight();
+ } else {
+ br = bl + getMeasuredWidth();
+ bb = bt + mDragDistance;
+ }
+ return new Rect(bl, bt, br, bb);
+ }
+
+ public void setOnDoubleClickListener(DoubleClickListener doubleClickListener) {
+ mDoubleClickListener = doubleClickListener;
+ }
+
+ public interface DoubleClickListener {
+ public void onDoubleClick(SwipeLayout layout, boolean surface);
+ }
+
+ private int dp2px(float dp) {
+ return (int) (dp * getContext().getResources().getDisplayMetrics().density + 0.5f);
+ }
+
+ public List getDragEdges() {
+ return mDragEdges;
+ }
+
+ public void setDragEdges(List mDragEdges) {
+ this.mDragEdges = mDragEdges;
+ currentDirectionIndex = 0;
+ populateIndexes();
+ updateBottomViews();
+ }
+
+ public void setDragEdges(DragEdge... mDragEdges) {
+ this.mDragEdges = new ArrayList();
+ for (DragEdge e : mDragEdges) {
+ this.mDragEdges.add(e);
+ }
+ currentDirectionIndex = 0;
+ populateIndexes();
+ updateBottomViews();
+ }
+
+ private void populateIndexes() {
+ mLeftIndex = this.mDragEdges.indexOf(DragEdge.Left);
+ mRightIndex = this.mDragEdges.indexOf(DragEdge.Right);
+ mTopIndex = this.mDragEdges.indexOf(DragEdge.Top);
+ mBottomIndex = this.mDragEdges.indexOf(DragEdge.Bottom);
+ }
+
+ private float getCurrentOffset() {
+ if (mDragEdges.get(currentDirectionIndex) == DragEdge.Left) return mLeftEdgeSwipeOffset;
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Right)
+ return mRightEdgeSwipeOffset;
+ else if (mDragEdges.get(currentDirectionIndex) == DragEdge.Top) return mTopEdgeSwipeOffset;
+ else return mBottomEdgeSwipeOffset;
+ }
+
+ private void updateBottomViews() {
+// removeAllViews();
+// addView(getBottomViews().get(currentDirectionIndex));
+// addView(getSurfaceView());
+// getBottomViews().get(currentDirectionIndex).bringToFront();
+// getSurfaceView().bringToFront();
+ if (mShowMode == ShowMode.PullOut)
+ layoutPullOut();
+ else if (mShowMode == ShowMode.LayDown) layoutLayDown();
+
+ safeBottomView();
+
+ if (mOnLayoutListeners != null) for (int i = 0; i < mOnLayoutListeners.size(); i++) {
+ mOnLayoutListeners.get(i).onLayout(this);
+ }
+ }
+}
diff --git a/library/src/main/java/com/daimajia/swipe/adapters/ArraySwipeAdapter.java b/library/src/main/java/com/daimajia/swipe/adapters/ArraySwipeAdapter.java
index 461b38d..3912e72 100644
--- a/library/src/main/java/com/daimajia/swipe/adapters/ArraySwipeAdapter.java
+++ b/library/src/main/java/com/daimajia/swipe/adapters/ArraySwipeAdapter.java
@@ -6,15 +6,17 @@ import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import com.daimajia.swipe.SwipeLayout;
+import com.daimajia.swipe.implments.SwipeItemAdapterMangerImpl;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
+import com.daimajia.swipe.util.Attributes;
import java.util.List;
public abstract class ArraySwipeAdapter extends ArrayAdapter implements SwipeItemMangerInterface,SwipeAdapterInterface {
- private SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);
+ private SwipeItemAdapterMangerImpl mItemManger = new SwipeItemAdapterMangerImpl(this);
{}
public ArraySwipeAdapter(Context context, int resource) {
super(context, resource);
@@ -67,6 +69,11 @@ public abstract class ArraySwipeAdapter extends ArrayAdapter implements Swipe
mItemManger.closeAllExcept(layout);
}
+ @Override
+ public void closeAllItems() {
+ mItemManger.closeAllItems();
+ }
+
@Override
public List getOpenItems() {
return mItemManger.getOpenItems();
@@ -88,12 +95,12 @@ public abstract class ArraySwipeAdapter extends ArrayAdapter implements Swipe
}
@Override
- public SwipeItemMangerImpl.Mode getMode() {
+ public Attributes.Mode getMode() {
return mItemManger.getMode();
}
@Override
- public void setMode(SwipeItemMangerImpl.Mode mode) {
+ public void setMode(Attributes.Mode mode) {
mItemManger.setMode(mode);
}
}
diff --git a/library/src/main/java/com/daimajia/swipe/adapters/BaseSwipeAdapter.java b/library/src/main/java/com/daimajia/swipe/adapters/BaseSwipeAdapter.java
index f78d414..b7fb1ae 100644
--- a/library/src/main/java/com/daimajia/swipe/adapters/BaseSwipeAdapter.java
+++ b/library/src/main/java/com/daimajia/swipe/adapters/BaseSwipeAdapter.java
@@ -5,15 +5,17 @@ import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.daimajia.swipe.SwipeLayout;
+import com.daimajia.swipe.implments.SwipeItemAdapterMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
+import com.daimajia.swipe.util.Attributes;
import java.util.List;
public abstract class BaseSwipeAdapter extends BaseAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {
- protected SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);
+ protected SwipeItemAdapterMangerImpl mItemManger = new SwipeItemAdapterMangerImpl(this);
/**
* return the {@link com.daimajia.swipe.SwipeLayout} resource id, int the view item.
@@ -69,6 +71,11 @@ public abstract class BaseSwipeAdapter extends BaseAdapter implements SwipeItemM
mItemManger.closeAllExcept(layout);
}
+ @Override
+ public void closeAllItems() {
+ mItemManger.closeAllItems();
+ }
+
@Override
public List getOpenItems() {
return mItemManger.getOpenItems();
@@ -90,12 +97,12 @@ public abstract class BaseSwipeAdapter extends BaseAdapter implements SwipeItemM
}
@Override
- public SwipeItemMangerImpl.Mode getMode() {
+ public Attributes.Mode getMode() {
return mItemManger.getMode();
}
@Override
- public void setMode(SwipeItemMangerImpl.Mode mode) {
+ public void setMode(Attributes.Mode mode) {
mItemManger.setMode(mode);
}
}
diff --git a/library/src/main/java/com/daimajia/swipe/adapters/CursorSwipeAdapter.java b/library/src/main/java/com/daimajia/swipe/adapters/CursorSwipeAdapter.java
index fd55eac..0bde0e8 100644
--- a/library/src/main/java/com/daimajia/swipe/adapters/CursorSwipeAdapter.java
+++ b/library/src/main/java/com/daimajia/swipe/adapters/CursorSwipeAdapter.java
@@ -7,15 +7,17 @@ import android.view.View;
import android.view.ViewGroup;
import com.daimajia.swipe.SwipeLayout;
+import com.daimajia.swipe.implments.SwipeItemAdapterMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
+import com.daimajia.swipe.util.Attributes;
import java.util.List;
public abstract class CursorSwipeAdapter extends CursorAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {
- private SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);
+ private SwipeItemAdapterMangerImpl mItemManger = new SwipeItemAdapterMangerImpl(this);
protected CursorSwipeAdapter(Context context, Cursor c, boolean autoRequery) {
super(context, c, autoRequery);
@@ -73,12 +75,12 @@ public abstract class CursorSwipeAdapter extends CursorAdapter implements SwipeI
}
@Override
- public SwipeItemMangerImpl.Mode getMode() {
+ public Attributes.Mode getMode() {
return mItemManger.getMode();
}
@Override
- public void setMode(SwipeItemMangerImpl.Mode mode) {
+ public void setMode(Attributes.Mode mode) {
mItemManger.setMode(mode);
}
}
diff --git a/library/src/main/java/com/daimajia/swipe/adapters/RecyclerSwipeAdapter.java b/library/src/main/java/com/daimajia/swipe/adapters/RecyclerSwipeAdapter.java
new file mode 100644
index 0000000..e68de7f
--- /dev/null
+++ b/library/src/main/java/com/daimajia/swipe/adapters/RecyclerSwipeAdapter.java
@@ -0,0 +1,73 @@
+package com.daimajia.swipe.adapters;
+
+import android.support.v7.widget.RecyclerView;
+import android.view.ViewGroup;
+
+import com.daimajia.swipe.SwipeLayout;
+import com.daimajia.swipe.implments.SwipeItemRecyclerMangerImpl;
+import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
+import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
+import com.daimajia.swipe.util.Attributes;
+
+import java.util.List;
+
+public abstract class RecyclerSwipeAdapter extends RecyclerView.Adapter implements SwipeItemMangerInterface, SwipeAdapterInterface {
+
+ public SwipeItemRecyclerMangerImpl mItemManger = new SwipeItemRecyclerMangerImpl(this);
+
+ @Override
+ public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
+
+ @Override
+ public abstract void onBindViewHolder(VH viewHolder, final int position);
+
+ @Override
+ public void openItem(int position) {
+ mItemManger.openItem(position);
+ }
+
+ @Override
+ public void closeItem(int position) {
+ mItemManger.closeItem(position);
+ }
+
+ @Override
+ public void closeAllExcept(SwipeLayout layout) {
+ mItemManger.closeAllExcept(layout);
+ }
+
+ @Override
+ public void closeAllItems() {
+ mItemManger.closeAllItems();
+ }
+
+ @Override
+ public List getOpenItems() {
+ return mItemManger.getOpenItems();
+ }
+
+ @Override
+ public List getOpenLayouts() {
+ return mItemManger.getOpenLayouts();
+ }
+
+ @Override
+ public void removeShownLayouts(SwipeLayout layout) {
+ mItemManger.removeShownLayouts(layout);
+ }
+
+ @Override
+ public boolean isOpen(int position) {
+ return mItemManger.isOpen(position);
+ }
+
+ @Override
+ public Attributes.Mode getMode() {
+ return mItemManger.getMode();
+ }
+
+ @Override
+ public void setMode(Attributes.Mode mode) {
+ mItemManger.setMode(mode);
+ }
+}
diff --git a/library/src/main/java/com/daimajia/swipe/adapters/SimpleCursorSwipeAdapter.java b/library/src/main/java/com/daimajia/swipe/adapters/SimpleCursorSwipeAdapter.java
index 6a0883a..75fbe0c 100644
--- a/library/src/main/java/com/daimajia/swipe/adapters/SimpleCursorSwipeAdapter.java
+++ b/library/src/main/java/com/daimajia/swipe/adapters/SimpleCursorSwipeAdapter.java
@@ -7,15 +7,17 @@ import android.view.View;
import android.view.ViewGroup;
import com.daimajia.swipe.SwipeLayout;
+import com.daimajia.swipe.implments.SwipeItemAdapterMangerImpl;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
+import com.daimajia.swipe.util.Attributes;
import java.util.List;
public abstract class SimpleCursorSwipeAdapter extends SimpleCursorAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {
- private SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);
+ private SwipeItemAdapterMangerImpl mItemManger = new SwipeItemAdapterMangerImpl(this);
protected SimpleCursorSwipeAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
super(context, layout, c, from, to, flags);
@@ -73,12 +75,12 @@ public abstract class SimpleCursorSwipeAdapter extends SimpleCursorAdapter imple
}
@Override
- public SwipeItemMangerImpl.Mode getMode() {
+ public Attributes.Mode getMode() {
return mItemManger.getMode();
}
@Override
- public void setMode(SwipeItemMangerImpl.Mode mode) {
+ public void setMode(Attributes.Mode mode) {
mItemManger.setMode(mode);
}
}
diff --git a/library/src/main/java/com/daimajia/swipe/implments/SwipeItemAdapterMangerImpl.java b/library/src/main/java/com/daimajia/swipe/implments/SwipeItemAdapterMangerImpl.java
new file mode 100644
index 0000000..de3a570
--- /dev/null
+++ b/library/src/main/java/com/daimajia/swipe/implments/SwipeItemAdapterMangerImpl.java
@@ -0,0 +1,66 @@
+package com.daimajia.swipe.implments;
+
+import android.view.View;
+import android.widget.BaseAdapter;
+
+import com.daimajia.swipe.SimpleSwipeListener;
+import com.daimajia.swipe.SwipeLayout;
+import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
+import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
+import com.daimajia.swipe.util.Attributes;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * SwipeItemMangerImpl is a helper class to help all the adapters to maintain open status.
+ */
+public class SwipeItemAdapterMangerImpl extends SwipeItemMangerImpl{
+
+ protected BaseAdapter mAdapter;
+
+ public SwipeItemAdapterMangerImpl(BaseAdapter adapter) {
+ super(adapter);
+ this.mAdapter = adapter;
+ }
+
+ @Override
+ public void initialize(View target, int position) {
+ int resId = getSwipeLayoutId(position);
+
+ OnLayoutListener onLayoutListener = new OnLayoutListener(position);
+ SwipeLayout swipeLayout = (SwipeLayout) target.findViewById(resId);
+ if (swipeLayout == null)
+ throw new IllegalStateException("can not find SwipeLayout in target view");
+
+ SwipeMemory swipeMemory = new SwipeMemory(position);
+ swipeLayout.addSwipeListener(swipeMemory);
+ swipeLayout.addOnLayoutListener(onLayoutListener);
+ swipeLayout.setTag(resId, new ValueBox(position, swipeMemory, onLayoutListener));
+
+ mShownLayouts.add(swipeLayout);
+ }
+
+ @Override
+ public void updateConvertView(View target, int position) {
+ int resId = getSwipeLayoutId(position);
+
+ SwipeLayout swipeLayout = (SwipeLayout) target.findViewById(resId);
+ if (swipeLayout == null)
+ throw new IllegalStateException("can not find SwipeLayout in target view");
+
+ ValueBox valueBox = (ValueBox) swipeLayout.getTag(resId);
+ valueBox.swipeMemory.setPosition(position);
+ valueBox.onLayoutListener.setPosition(position);
+ valueBox.position = position;
+ }
+
+ @Override
+ public void bindView(View target, int position){
+
+ }
+
+}
diff --git a/library/src/main/java/com/daimajia/swipe/implments/SwipeItemMangerImpl.java b/library/src/main/java/com/daimajia/swipe/implments/SwipeItemMangerImpl.java
index fdb20f8..e4a330e 100644
--- a/library/src/main/java/com/daimajia/swipe/implments/SwipeItemMangerImpl.java
+++ b/library/src/main/java/com/daimajia/swipe/implments/SwipeItemMangerImpl.java
@@ -1,5 +1,6 @@
package com.daimajia.swipe.implments;
+import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.BaseAdapter;
@@ -7,6 +8,7 @@ import com.daimajia.swipe.SimpleSwipeListener;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
+import com.daimajia.swipe.util.Attributes;
import java.util.ArrayList;
import java.util.Arrays;
@@ -17,9 +19,9 @@ import java.util.Set;
/**
* SwipeItemMangerImpl is a helper class to help all the adapters to maintain open status.
*/
-public class SwipeItemMangerImpl implements SwipeItemMangerInterface {
+public abstract class SwipeItemMangerImpl implements SwipeItemMangerInterface {
- private Mode mode = Mode.Single;
+ private Attributes.Mode mode = Attributes.Mode.Single;
public final int INVALID_POSITION = -1;
protected int mOpenPosition = INVALID_POSITION;
@@ -27,96 +29,108 @@ public class SwipeItemMangerImpl implements SwipeItemMangerInterface {
protected Set mOpenPositions = new HashSet();
protected Set mShownLayouts = new HashSet();
- protected BaseAdapter mAdapter;
+ protected BaseAdapter mBaseAdapter;
+ protected RecyclerView.Adapter mRecyclerAdapter;
public SwipeItemMangerImpl(BaseAdapter adapter) {
- if(adapter == null)
+ if (adapter == null)
throw new IllegalArgumentException("Adapter can not be null");
- if(!(adapter instanceof SwipeItemMangerInterface))
+ if (!(adapter instanceof SwipeItemMangerInterface))
throw new IllegalArgumentException("adapter should implement the SwipeAdapterInterface");
- this.mAdapter = adapter;
+ this.mBaseAdapter = adapter;
}
- public enum Mode{
- Single, Multiple
- };
+ public SwipeItemMangerImpl(RecyclerView.Adapter adapter) {
+ if (adapter == null)
+ throw new IllegalArgumentException("Adapter can not be null");
- public Mode getMode(){
+ if (!(adapter instanceof SwipeItemMangerInterface))
+ throw new IllegalArgumentException("adapter should implement the SwipeAdapterInterface");
+
+ this.mRecyclerAdapter = adapter;
+ }
+
+ public Attributes.Mode getMode() {
return mode;
}
- public void setMode(Mode mode){
+ public void setMode(Attributes.Mode mode) {
this.mode = mode;
mOpenPositions.clear();
mShownLayouts.clear();
mOpenPosition = INVALID_POSITION;
}
- public void initialize(View target, int position) {
- int resId = getSwipeLayoutId(position);
+ /* initialize and updateConvertView used for AdapterManagerImpl */
+ public abstract void initialize(View target, int position);
- OnLayoutListener onLayoutListener = new OnLayoutListener(position);
- SwipeLayout swipeLayout = (SwipeLayout)target.findViewById(resId);
- if(swipeLayout == null)
- throw new IllegalStateException("can not find SwipeLayout in target view");
+ public abstract void updateConvertView(View target, int position);
- SwipeMemory swipeMemory = new SwipeMemory(position);
- swipeLayout.addSwipeListener(swipeMemory);
- swipeLayout.addOnLayoutListener(onLayoutListener);
- swipeLayout.setTag(resId, new ValueBox(position, swipeMemory, onLayoutListener));
+ /* bindView used for RecyclerViewManagerImpl */
+ public abstract void bindView(View target, int position);
- mShownLayouts.add(swipeLayout);
- }
-
- public void updateConvertView(View target, int position) {
- int resId = getSwipeLayoutId(position);
-
- SwipeLayout swipeLayout = (SwipeLayout)target.findViewById(resId);
- if(swipeLayout == null)
- throw new IllegalStateException("can not find SwipeLayout in target view");
-
- ValueBox valueBox = (ValueBox)swipeLayout.getTag(resId);
- valueBox.swipeMemory.setPosition(position);
- valueBox.onLayoutListener.setPosition(position);
- valueBox.position = position;
- }
-
- private int getSwipeLayoutId(int position){
- return ((SwipeAdapterInterface)(mAdapter)).getSwipeLayoutResourceId(position);
+ public int getSwipeLayoutId(int position) {
+ if (mBaseAdapter != null) {
+ return ((SwipeAdapterInterface) (mBaseAdapter)).getSwipeLayoutResourceId(position);
+ } else if (mRecyclerAdapter != null) {
+ return ((SwipeAdapterInterface) (mRecyclerAdapter)).getSwipeLayoutResourceId(position);
+ } else {
+ return -1;
+ }
}
@Override
public void openItem(int position) {
- if(mode == Mode.Multiple){
- if(!mOpenPositions.contains(position))
+ if (mode == Attributes.Mode.Multiple) {
+ if (!mOpenPositions.contains(position))
mOpenPositions.add(position);
- }else{
+ } else {
mOpenPosition = position;
}
- mAdapter.notifyDataSetChanged();
+ if (mBaseAdapter != null) {
+ mBaseAdapter.notifyDataSetChanged();
+ } else if (mRecyclerAdapter != null) {
+ mRecyclerAdapter.notifyDataSetChanged();
+ }
}
@Override
public void closeItem(int position) {
- if(mode == Mode.Multiple){
+ if (mode == Attributes.Mode.Multiple) {
mOpenPositions.remove(position);
- }else{
- if(mOpenPosition == position)
+ } else {
+ if (mOpenPosition == position)
mOpenPosition = INVALID_POSITION;
}
- mAdapter.notifyDataSetChanged();
+ if (mBaseAdapter != null) {
+ mBaseAdapter.notifyDataSetChanged();
+ } else if (mRecyclerAdapter != null) {
+ mRecyclerAdapter.notifyDataSetChanged();
+ }
}
@Override
public void closeAllExcept(SwipeLayout layout) {
- for(SwipeLayout s : mShownLayouts){
- if(s != layout)
+ for (SwipeLayout s : mShownLayouts) {
+ if (s != layout)
s.close();
}
}
+ @Override
+ public void closeAllItems() {
+ if (mode == Attributes.Mode.Multiple) {
+ mOpenPositions.clear();
+ } else {
+ mOpenPosition = INVALID_POSITION;
+ }
+ for (SwipeLayout s : mShownLayouts) {
+ s.close();
+ }
+ }
+
@Override
public void removeShownLayouts(SwipeLayout layout) {
mShownLayouts.remove(layout);
@@ -124,9 +138,9 @@ public class SwipeItemMangerImpl implements SwipeItemMangerInterface {
@Override
public List getOpenItems() {
- if(mode == Mode.Multiple){
+ if (mode == Attributes.Mode.Multiple) {
return new ArrayList(mOpenPositions);
- }else{
+ } else {
return Arrays.asList(mOpenPosition);
}
}
@@ -138,9 +152,9 @@ public class SwipeItemMangerImpl implements SwipeItemMangerInterface {
@Override
public boolean isOpen(int position) {
- if(mode == Mode.Multiple){
+ if (mode == Attributes.Mode.Multiple) {
return mOpenPositions.contains(position);
- }else{
+ } else {
return mOpenPosition == position;
}
}
@@ -157,7 +171,7 @@ public class SwipeItemMangerImpl implements SwipeItemMangerInterface {
}
}
- class OnLayoutListener implements SwipeLayout.OnLayout{
+ class OnLayoutListener implements SwipeLayout.OnLayout {
private int position;
@@ -165,15 +179,15 @@ public class SwipeItemMangerImpl implements SwipeItemMangerInterface {
this.position = position;
}
- public void setPosition(int position){
+ public void setPosition(int position) {
this.position = position;
}
@Override
public void onLayout(SwipeLayout v) {
- if(isOpen(position)){
+ if (isOpen(position)) {
v.open(false, false);
- }else{
+ } else {
v.close(false, false);
}
}
@@ -190,23 +204,23 @@ public class SwipeItemMangerImpl implements SwipeItemMangerInterface {
@Override
public void onClose(SwipeLayout layout) {
- if(mode == Mode.Multiple){
+ if (mode == Attributes.Mode.Multiple) {
mOpenPositions.remove(position);
- }else{
+ } else {
mOpenPosition = INVALID_POSITION;
}
}
@Override
public void onStartOpen(SwipeLayout layout) {
- if(mode == Mode.Single) {
+ if (mode == Attributes.Mode.Single) {
closeAllExcept(layout);
}
}
@Override
public void onOpen(SwipeLayout layout) {
- if (mode == Mode.Multiple)
+ if (mode == Attributes.Mode.Multiple)
mOpenPositions.add(position);
else {
closeAllExcept(layout);
@@ -214,7 +228,7 @@ public class SwipeItemMangerImpl implements SwipeItemMangerInterface {
}
}
- public void setPosition(int position){
+ public void setPosition(int position) {
this.position = position;
}
}
diff --git a/library/src/main/java/com/daimajia/swipe/implments/SwipeItemRecyclerMangerImpl.java b/library/src/main/java/com/daimajia/swipe/implments/SwipeItemRecyclerMangerImpl.java
new file mode 100644
index 0000000..97cd725
--- /dev/null
+++ b/library/src/main/java/com/daimajia/swipe/implments/SwipeItemRecyclerMangerImpl.java
@@ -0,0 +1,63 @@
+package com.daimajia.swipe.implments;
+
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+import com.daimajia.swipe.SimpleSwipeListener;
+import com.daimajia.swipe.SwipeLayout;
+import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
+import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
+import com.daimajia.swipe.util.Attributes;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * SwipeItemRecyclerMangerImpl is a helper class to help the RecyclerView to maintain open status.
+ */
+public class SwipeItemRecyclerMangerImpl extends SwipeItemMangerImpl{
+
+ protected RecyclerView.Adapter mAdapter;
+
+ public SwipeItemRecyclerMangerImpl(RecyclerView.Adapter adapter) {
+ super(adapter);
+ this.mAdapter = adapter;
+ }
+
+ @Override
+ public void bindView(View target, int position) {
+ int resId = getSwipeLayoutId(position);
+
+ OnLayoutListener onLayoutListener = new OnLayoutListener(position);
+ SwipeLayout swipeLayout = (SwipeLayout) target.findViewById(resId);
+ if (swipeLayout == null)
+ throw new IllegalStateException("can not find SwipeLayout in target view");
+
+ if (swipeLayout.getTag(resId) == null) {
+ SwipeMemory swipeMemory = new SwipeMemory(position);
+ swipeLayout.addSwipeListener(swipeMemory);
+ swipeLayout.addOnLayoutListener(onLayoutListener);
+ swipeLayout.setTag(resId, new ValueBox(position, swipeMemory, onLayoutListener));
+ mShownLayouts.add(swipeLayout);
+ } else {
+ ValueBox valueBox = (ValueBox) swipeLayout.getTag(resId);
+ valueBox.swipeMemory.setPosition(position);
+ valueBox.onLayoutListener.setPosition(position);
+ valueBox.position = position;
+ }
+ }
+
+ @Override
+ public void initialize(View target, int position) {
+
+ }
+
+ @Override
+ public void updateConvertView(View target, int position) {
+
+ }
+
+}
diff --git a/library/src/main/java/com/daimajia/swipe/interfaces/SwipeItemMangerInterface.java b/library/src/main/java/com/daimajia/swipe/interfaces/SwipeItemMangerInterface.java
index 1a5e409..b03f4a3 100644
--- a/library/src/main/java/com/daimajia/swipe/interfaces/SwipeItemMangerInterface.java
+++ b/library/src/main/java/com/daimajia/swipe/interfaces/SwipeItemMangerInterface.java
@@ -2,6 +2,7 @@ package com.daimajia.swipe.interfaces;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
+import com.daimajia.swipe.util.Attributes;
import java.util.List;
@@ -12,6 +13,8 @@ public interface SwipeItemMangerInterface {
public void closeItem(int position);
public void closeAllExcept(SwipeLayout layout);
+
+ public void closeAllItems();
public List getOpenItems();
@@ -21,7 +24,7 @@ public interface SwipeItemMangerInterface {
public boolean isOpen(int position);
- public SwipeItemMangerImpl.Mode getMode();
+ public Attributes.Mode getMode();
- public void setMode(SwipeItemMangerImpl.Mode mode);
+ public void setMode(Attributes.Mode mode);
}
diff --git a/library/src/main/java/com/daimajia/swipe/util/Attributes.java b/library/src/main/java/com/daimajia/swipe/util/Attributes.java
new file mode 100644
index 0000000..697c64a
--- /dev/null
+++ b/library/src/main/java/com/daimajia/swipe/util/Attributes.java
@@ -0,0 +1,9 @@
+package com.daimajia.swipe.util;
+
+
+public class Attributes {
+
+ public enum Mode {
+ Single, Multiple
+ }
+}