diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..797c2f4b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,12 @@ +language: android +android: + components: + - tools + - platform-tools + - build-tools-25.0.2 + - android-25 + - extra-android-support + - extra + - extra-android-m2repository +script: + - ./gradlew assembleDebug \ No newline at end of file diff --git a/README.md b/README.md index 6adde701..55c53938 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ -# Android Swipe Layout +# Android Swipe Layout [![Build Status](https://travis-ci.org/daimajia/AndroidSwipeLayout.svg?branch=master)](https://travis-ci.org/daimajia/AndroidSwipeLayout) + +[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/daimajia/AndroidSwipeLayout?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +[![Insight.io](https://insight.io/repoBadge/github.com/daimajia/AndroidSwipeLayout)](https://insight.io/github.com/daimajia/AndroidSwipeLayout) This is the brother of [AndroidViewHover](https://github.com/daimajia/AndroidViewHover). @@ -14,7 +18,7 @@ Time passed, finally...as you see right now. ![](http://ww2.sinaimg.cn/mw690/610dc034jw1ejoplapwtqg208n0e74dx.gif) -[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. @@ -36,8 +40,9 @@ When I start to make this library, I set some goals: ```groovy dependencies { - compile 'com.android.support:support-v4:20.+' - compile "com.daimajia.swipelayout:library:1.1.7@aar" + compile 'com.android.support:recyclerview-v7:21.0.0' + compile 'com.android.support:support-v4:20.+' + compile "com.daimajia.swipelayout:library:1.2.0@aar" } ``` @@ -49,20 +54,27 @@ dependencies { support-v4 r6 + + com.google.android + recyclerview-v7 + 21.0.0 + com.daimajia.swipelayout library - 1.1.7 + 1.2.0 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 +**Make sure to use the internal adapter instead of your own!** + [Wiki Usage](https://github.com/daimajia/AndroidSwipeLayout/wiki/usage) ## Wiki diff --git a/build.gradle b/build.gradle index a75fc818..82697f55 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,13 @@ buildscript { repositories { jcenter() + maven { + url "https://jitpack.io" + } } dependencies { - classpath 'com.android.tools.build:gradle:0.12.+' + classpath 'com.android.tools.build:gradle:2.3.0' + classpath 'com.github.dcendents:android-maven-plugin:1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -15,5 +19,8 @@ buildscript { allprojects { repositories { jcenter() + maven { + url "https://jitpack.io" + } } } diff --git a/demo/build.gradle b/demo/build.gradle index ae2fca12..09dca2ba 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -1,11 +1,13 @@ 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 +15,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:25.1.1' 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 34156678..0f57bf1a 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 8e79c45b..42fae4da 100644 --- a/demo/src/main/java/com/daimajia/swipedemo/GridViewExample.java +++ b/demo/src/main/java/com/daimajia/swipedemo/GridViewExample.java @@ -7,7 +7,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 +18,7 @@ protected void onCreate(Bundle savedInstanceState) { 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 3079cf4a..f957fc8d 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,8 @@ import android.widget.ListView; import android.widget.Toast; -import com.daimajia.swipe.implments.SwipeItemMangerImpl; +import com.daimajia.swipe.SwipeLayout; +import com.daimajia.swipe.util.Attributes; import com.daimajia.swipedemo.adapter.ListViewAdapter; public class ListViewExample extends Activity { @@ -22,11 +25,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 +49,17 @@ protected void onCreate(Bundle savedInstanceState) { 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; } }); @@ -57,13 +67,13 @@ public boolean onTouch(View v, MotionEvent event) { @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { Toast.makeText(mContext, "OnItemLongClickListener", Toast.LENGTH_SHORT).show(); - return false; + return true; } }); mListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { - Log.e("ListView","onScrollStateChanged"); + Log.e("ListView", "onScrollStateChanged"); } @Override @@ -104,10 +114,14 @@ public boolean onOptionsItemSelected(MenuItem item) { 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 18fb36f7..8a476218 100644 --- a/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java +++ b/demo/src/main/java/com/daimajia/swipedemo/MyActivity.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.graphics.Color; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -27,8 +28,12 @@ protected void onCreate(Bundle savedInstanceState) { //sample1 sample1 = (SwipeLayout) findViewById(R.id.sample1); - sample1.setShowMode(SwipeLayout.ShowMode.LayDown); - sample1.setDragEdge(SwipeLayout.DragEdge.Left); + sample1.setShowMode(SwipeLayout.ShowMode.PullOut); + View starBottView = sample1.findViewById(R.id.starbott); + sample1.addDrag(SwipeLayout.DragEdge.Left, sample1.findViewById(R.id.bottom_wrapper)); + sample1.addDrag(SwipeLayout.DragEdge.Right, sample1.findViewById(R.id.bottom_wrapper_2)); + sample1.addDrag(SwipeLayout.DragEdge.Top, starBottView); + sample1.addDrag(SwipeLayout.DragEdge.Bottom, starBottView); sample1.addRevealListener(R.id.delete, new SwipeLayout.OnRevealListener() { @Override public void onReveal(View child, SwipeLayout.DragEdge edge, float fraction, int distance) { @@ -36,10 +41,58 @@ public void onReveal(View child, SwipeLayout.DragEdge edge, float fraction, int } }); + sample1.getSurfaceView().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(MyActivity.this, "Click on surface", Toast.LENGTH_SHORT).show(); + Log.d(MyActivity.class.getName(), "click on surface"); + } + }); + sample1.getSurfaceView().setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + Toast.makeText(MyActivity.this, "longClick on surface", Toast.LENGTH_SHORT).show(); + Log.d(MyActivity.class.getName(), "longClick on surface"); + return true; + } + }); + 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(); + } + }); + + sample1.addRevealListener(R.id.starbott, 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); + } + }); + //sample2 sample2 = (SwipeLayout) findViewById(R.id.sample2); sample2.setShowMode(SwipeLayout.ShowMode.LayDown); + sample2.addDrag(SwipeLayout.DragEdge.Right, sample2.findViewWithTag("Bottom2")); // sample2.setShowMode(SwipeLayout.ShowMode.PullOut); sample2.findViewById(R.id.star).setOnClickListener(new View.OnClickListener() { @Override @@ -68,11 +121,17 @@ public void onClick(View v) { Toast.makeText(MyActivity.this, "Yo", Toast.LENGTH_SHORT).show(); } }); + sample2.getSurfaceView().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(MyActivity.this, "Click on surface", Toast.LENGTH_SHORT).show(); + } + }); //sample3 sample3 = (SwipeLayout) findViewById(R.id.sample3); - sample3.setDragEdge(SwipeLayout.DragEdge.Top); + sample3.addDrag(SwipeLayout.DragEdge.Top, sample3.findViewWithTag("Bottom3")); sample3.addRevealListener(R.id.bottom_wrapper_child1, new SwipeLayout.OnRevealListener() { @Override public void onReveal(View child, SwipeLayout.DragEdge edge, float fraction, int distance) { @@ -85,12 +144,18 @@ public void onReveal(View child, SwipeLayout.DragEdge edge, float fraction, int child.setBackgroundColor(c); } }); - sample3.findViewById(R.id.star).setOnClickListener(new View.OnClickListener() { + sample3.findViewById(R.id.bottom_wrapper_child1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MyActivity.this, "Yo!", Toast.LENGTH_SHORT).show(); } }); + sample3.getSurfaceView().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(MyActivity.this, "Click on surface", Toast.LENGTH_SHORT).show(); + } + }); } @@ -113,9 +178,11 @@ public boolean onOptionsItemSelected(MenuItem item) { } 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/RecyclerViewExample.java b/demo/src/main/java/com/daimajia/swipedemo/RecyclerViewExample.java new file mode 100644 index 00000000..fd42733f --- /dev/null +++ b/demo/src/main/java/com/daimajia/swipedemo/RecyclerViewExample.java @@ -0,0 +1,111 @@ +package com.daimajia.swipedemo; + +import android.app.ActionBar; +import android.app.Activity; +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/ListViewAdapter.java b/demo/src/main/java/com/daimajia/swipedemo/adapter/ListViewAdapter.java index 074e2de2..e34f31de 100644 --- a/demo/src/main/java/com/daimajia/swipedemo/adapter/ListViewAdapter.java +++ b/demo/src/main/java/com/daimajia/swipedemo/adapter/ListViewAdapter.java @@ -43,6 +43,12 @@ public void onDoubleClick(SwipeLayout layout, boolean surface) { Toast.makeText(mContext, "DoubleClick", Toast.LENGTH_SHORT).show(); } }); + v.findViewById(R.id.delete).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast.makeText(mContext, "click delete", Toast.LENGTH_SHORT).show(); + } + }); return v; } 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 00000000..3b4c34d4 --- /dev/null +++ b/demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewAdapter.java @@ -0,0 +1,104 @@ +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.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.bind(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 00000000..85b5b3d2 --- /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 00000000..613e8e52 --- /dev/null +++ b/demo/src/main/java/com/daimajia/swipedemo/adapter/util/RecyclerItemClickListener.java @@ -0,0 +1,45 @@ +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) { + } + + @Override + public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { + + } +} diff --git a/demo/src/main/res/drawable/dark_gray.xml b/demo/src/main/res/drawable/dark_gray.xml new file mode 100644 index 00000000..46878503 --- /dev/null +++ b/demo/src/main/res/drawable/dark_gray.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/demo/src/main/res/drawable/divider.xml b/demo/src/main/res/drawable/divider.xml new file mode 100644 index 00000000..111d79d3 --- /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/drawable/red.xml b/demo/src/main/res/drawable/red.xml new file mode 100644 index 00000000..707047e9 --- /dev/null +++ b/demo/src/main/res/drawable/red.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/demo/src/main/res/drawable/white.xml b/demo/src/main/res/drawable/white.xml new file mode 100644 index 00000000..8dfff14a --- /dev/null +++ b/demo/src/main/res/drawable/white.xml @@ -0,0 +1,8 @@ + + + + + + + + \ 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 54cc383a..4b2c5074 100644 --- a/demo/src/main/res/layout/listview_item.xml +++ b/demo/src/main/res/layout/listview_item.xml @@ -1,57 +1,62 @@ - - + + + android:layout_height="80dp" + android:background="#FF5534" + android:gravity="center" + android:tag="Bottom3" + android:weightSum="10"> - - - -