From 25e38f34f34be60ce6e59be36cd99dec6b3dec06 Mon Sep 17 00:00:00 2001 From: John Shelley Date: Thu, 18 Dec 2014 10:58:50 -0600 Subject: [PATCH 01/14] (gradle) Update gradle issues.. Updating gradle specfic issues that arrised when using Android Studio 1.0.+ --- build.gradle | 2 +- demo/build.gradle | 2 +- library/build.gradle | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) 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..bf08410 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -13,7 +13,7 @@ android { } buildTypes { release { - runProguard false + minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } diff --git a/library/build.gradle b/library/build.gradle index 7a17821..a5ad7c5 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -5,7 +5,6 @@ android { buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION defaultConfig { - applicationId "com.daimajia.swipe" minSdkVersion 8 targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) } From bd4749188ce0a2defdb8ae315164fed6e5b01030 Mon Sep 17 00:00:00 2001 From: John Shelley Date: Thu, 18 Dec 2014 14:53:53 -0600 Subject: [PATCH 02/14] (demo, recyclerview) Update demo.. see details -> Demo now includes the most simple form or using a recycler view in the codebase currently. Next step would be to create a more simplified approach at a RecyclerViewSwipeAdapter that a user can extend from and only implement smaller methods instead of all the implementations. --- demo/build.gradle | 8 +- demo/src/main/AndroidManifest.xml | 16 +- .../daimajia/swipedemo/GridViewExample.java | 3 +- .../daimajia/swipedemo/ListViewExample.java | 3 +- .../com/daimajia/swipedemo/MyActivity.java | 6 +- .../swipedemo/RecyclerViewExample.java | 151 ++++++++++++ .../adapter/RecyclerViewSimpleAdapter.java | 132 +++++++++++ demo/src/main/res/drawable/divider.xml | 24 ++ demo/src/main/res/layout/listview_item.xml | 58 ++--- demo/src/main/res/layout/recyclerview.xml | 7 + demo/src/main/res/menu/my.xml | 23 +- library/build.gradle | 3 +- .../swipe/adapters/ArraySwipeAdapter.java | 5 +- .../swipe/adapters/BaseSwipeAdapter.java | 5 +- .../swipe/adapters/CursorSwipeAdapter.java | 5 +- .../adapters/SimpleCursorSwipeAdapter.java | 5 +- .../swipe/implments/SwipeItemMangerImpl.java | 25 +- .../SwipeItemRecyclerMangerImpl.java | 219 ++++++++++++++++++ .../interfaces/SwipeItemMangerInterface.java | 5 +- .../com/daimajia/swipe/util/Attributes.java | 9 + 20 files changed, 640 insertions(+), 72 deletions(-) create mode 100644 demo/src/main/java/com/daimajia/swipedemo/RecyclerViewExample.java create mode 100644 demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewSimpleAdapter.java create mode 100644 demo/src/main/res/drawable/divider.xml create mode 100644 demo/src/main/res/layout/recyclerview.xml create mode 100644 library/src/main/java/com/daimajia/swipe/implments/SwipeItemRecyclerMangerImpl.java create mode 100644 library/src/main/java/com/daimajia/swipe/util/Attributes.java diff --git a/demo/build.gradle b/demo/build.gradle index bf08410..244366f 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -1,5 +1,9 @@ apply plugin: 'com.android.application' +repositories { + maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } +} + android { compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION @@ -21,8 +25,10 @@ android { 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' + compile 'org.lucasr.twowayview:core:1.0.0-SNAPSHOT@aar' + compile 'org.lucasr.twowayview:layouts:1.0.0-SNAPSHOT@aar' } diff --git a/demo/src/main/AndroidManifest.xml b/demo/src/main/AndroidManifest.xml index 3415667..318a010 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..4868a95 100644 --- a/demo/src/main/java/com/daimajia/swipedemo/ListViewExample.java +++ b/demo/src/main/java/com/daimajia/swipedemo/ListViewExample.java @@ -15,6 +15,7 @@ import android.widget.ListView; import android.widget.Toast; import com.daimajia.swipe.implments.SwipeItemMangerImpl; +import com.daimajia.swipe.util.Attributes; import com.daimajia.swipedemo.adapter.ListViewAdapter; public class ListViewExample extends Activity { @@ -39,7 +40,7 @@ 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) { diff --git a/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java b/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java index 18fb36f..e1149dd 100644 --- a/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java +++ b/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java @@ -113,11 +113,13 @@ 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); + return super.onOptionsItemSelected(item); } /* 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..a7415f4 --- /dev/null +++ b/demo/src/main/java/com/daimajia/swipedemo/RecyclerViewExample.java @@ -0,0 +1,151 @@ +package com.daimajia.swipedemo; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +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 android.view.MotionEvent; +import android.view.View; +import android.widget.Toast; + +import com.daimajia.swipe.util.Attributes; +import com.daimajia.swipedemo.adapter.RecyclerViewSimpleAdapter; + +import org.lucasr.twowayview.ItemClickSupport; +import org.lucasr.twowayview.TwoWayLayoutManager; +import org.lucasr.twowayview.widget.DividerItemDecoration; +import org.lucasr.twowayview.widget.ListLayoutManager; + +public class RecyclerViewExample extends Activity { + + private RecyclerView recyclerView; + private RecyclerView.Adapter mAdapter; + // RecyclerView.LayoutManager: https://developer.android.com/reference/android/support/v7/widget/RecyclerView.LayoutManager.html + // Our LayoutManager uses: https://github.com/lucasr/twoway-view to help with decoration and can be used for a more advanced config as well. + // Read http://lucasr.org/2014/07/31/the-new-twowayview/ for a better understanding + private RecyclerView.LayoutManager mLayoutManager; + private Context mContext = this; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.recyclerview); + recyclerView = (RecyclerView) findViewById(R.id.recycler_view); + + /** + * The following comment is the sample usage of ArraySwipeAdapter. + */ + String[] adapterData = new String[]{"Activity", "Service", "Content Provider", "Intent", "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", + "DDMS", "Android Studio", "Fragment", "Loader", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient"}; + + // Uses a ListLayout manager from TwoWayView Lib: + mLayoutManager = new ListLayoutManager(this, TwoWayLayoutManager.Orientation.VERTICAL); + recyclerView.setLayoutManager(mLayoutManager); + final Drawable divider = getResources().getDrawable(R.drawable.divider); + recyclerView.addItemDecoration(new DividerItemDecoration(divider)); + + mAdapter = new RecyclerViewSimpleAdapter(this, adapterData); + recyclerView.setAdapter(mAdapter); + ((RecyclerViewSimpleAdapter) mAdapter).setMode(Attributes.Mode.Single); + + /* Listeners */ + ItemClickSupport itemClick = ItemClickSupport.addTo(recyclerView); + itemClick.setOnItemClickListener(onItemClickListener); + recyclerView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + Log.e("ListView", "OnTouch"); + return false; + } + }); + recyclerView.setOnScrollListener(onScrollListener); + + // TODO: Item Long Click is firing for every touch. +// itemClick.setOnItemLongClickListener(onItemLongClickListener); + + // TODO: Item Selection Support for RecyclerView +// recyclerView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { +// @Override +// public void onItemSelected(AdapterView parent, View view, int position, long id) { +// Log.e("ListView", "onItemSelected:" + position); +// } +// +// @Override +// public void onNothingSelected(AdapterView parent) { +// Log.e("ListView", "onNothingSelected:"); +// } +// }); + + } + + /** + * Substitute for our onItemClick listener for RecyclerView + */ + ItemClickSupport.OnItemClickListener onItemClickListener = new ItemClickSupport.OnItemClickListener() { + @Override + public void onItemClick(RecyclerView parent, View child, int position, long id) { + Toast.makeText(mContext, "Clicked:" + position, Toast.LENGTH_SHORT).show(); + } + }; + + /** + * Substitute for our onItemLongClick listener for RecyclerView + */ + ItemClickSupport.OnItemLongClickListener onItemLongClickListener = new ItemClickSupport.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(RecyclerView recyclerView, View view, int position, long id) { + Toast.makeText(mContext, "OnItemLongClickListener:" + position, Toast.LENGTH_SHORT).show(); + return false; + } + }; + + /** + * 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); + } + }; + + + @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/RecyclerViewSimpleAdapter.java b/demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewSimpleAdapter.java new file mode 100644 index 0000000..6e49d57 --- /dev/null +++ b/demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewSimpleAdapter.java @@ -0,0 +1,132 @@ +package com.daimajia.swipedemo.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +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.implments.SwipeItemRecyclerMangerImpl; +import com.daimajia.swipe.interfaces.SwipeAdapterInterface; +import com.daimajia.swipe.interfaces.SwipeItemMangerInterface; +import com.daimajia.swipe.util.Attributes; +import com.daimajia.swipedemo.R; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class RecyclerViewSimpleAdapter extends RecyclerView.Adapter implements SwipeItemMangerInterface, SwipeAdapterInterface { + + public static class ViewHolder extends RecyclerView.ViewHolder { + SwipeLayout swipeLayout; + TextView textView; + + public ViewHolder(View itemView) { + super(itemView); + swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipe); + textView = (TextView) itemView.findViewById(R.id.position); + } + } + + private Context mContext; + private String[] mDataset; + + protected SwipeItemRecyclerMangerImpl mItemManger = new SwipeItemRecyclerMangerImpl(this); + + + public RecyclerViewSimpleAdapter(Context context, String[] objects) { + this.mContext = context; + this.mDataset = objects; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listview_item, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder viewHolder, int position) { + 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.textView.setText((position + 1) + "."); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemCount() { + return mDataset.length; + } + + @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 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); + } + + @Override + public int getSwipeLayoutResourceId(int position) { + return R.id.swipe; + } +} diff --git a/demo/src/main/res/drawable/divider.xml b/demo/src/main/res/drawable/divider.xml new file mode 100644 index 0000000..c837d29 --- /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 db12e97..4dd617b 100644 --- a/demo/src/main/res/layout/listview_item.xml +++ b/demo/src/main/res/layout/listview_item.xml @@ -2,58 +2,62 @@ - + swipe:horizontalSwipeOffset="0dp"> + android:layout_height="80dp" + android:background="#FF5534" + android:gravity="center" + android:tag="Bottom3" + android:weightSum="10"> + + android:layout_height="30dp" + android:layout_weight="1" + android:src="@drawable/trash" /> + + android:layout_height="wrap_content" + android:layout_weight="5" + android:text="Delete Item?" + android:textColor="#fff" + android:textSize="17sp" /> +