Repository: daimajia/AndroidSwipeLayout Branch: master Commit: 5f8678b04751 Files: 71 Total size: 164.7 KB Directory structure: gitextract_y9qg2upq/ ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── build.gradle ├── demo/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── daimajia/ │ │ └── swipedemo/ │ │ ├── GridViewExample.java │ │ ├── ListViewExample.java │ │ ├── MyActivity.java │ │ ├── NestedExample.java │ │ ├── RecyclerViewExample.java │ │ └── adapter/ │ │ ├── ArraySwipeAdapterSample.java │ │ ├── GridViewAdapter.java │ │ ├── ListViewAdapter.java │ │ ├── RecyclerViewAdapter.java │ │ └── util/ │ │ ├── DividerItemDecoration.java │ │ └── RecyclerItemClickListener.java │ └── res/ │ ├── drawable/ │ │ ├── dark_gray.xml │ │ ├── divider.xml │ │ ├── item_selector.xml │ │ ├── red.xml │ │ └── white.xml │ ├── layout/ │ │ ├── complicate_layout.xml │ │ ├── grid_item.xml │ │ ├── gridview.xml │ │ ├── listview.xml │ │ ├── listview_item.xml │ │ ├── main.xml │ │ ├── recyclerview.xml │ │ ├── recyclerview_item.xml │ │ ├── sampe_nested_edittext.xml │ │ ├── sampe_nested_scrollview.xml │ │ ├── sampe_nested_seekbar.xml │ │ ├── sample1.xml │ │ ├── sample2.xml │ │ ├── sample3.xml │ │ ├── sample_nested_parent.xml │ │ └── sample_together.xml │ ├── menu/ │ │ └── my.xml │ ├── values/ │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── values-w820dp/ │ └── dimens.xml ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── library/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle-mvn-push.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── daimajia/ │ │ └── swipe/ │ │ ├── SimpleSwipeListener.java │ │ ├── SwipeLayout.java │ │ ├── adapters/ │ │ │ ├── ArraySwipeAdapter.java │ │ │ ├── BaseSwipeAdapter.java │ │ │ ├── CursorSwipeAdapter.java │ │ │ ├── RecyclerSwipeAdapter.java │ │ │ └── SimpleCursorSwipeAdapter.java │ │ ├── implments/ │ │ │ └── SwipeItemMangerImpl.java │ │ ├── interfaces/ │ │ │ ├── SwipeAdapterInterface.java │ │ │ └── SwipeItemMangerInterface.java │ │ └── util/ │ │ └── Attributes.java │ └── res/ │ └── values/ │ └── attrs.xml └── settings.gradle ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .gradle /local.properties /.idea/workspace.xml .DS_Store /build # built application files *.apk *.ap_ # files for the dex VM *.dex # Java class files *.class .DS_Store # generated files bin/ gen/ Wiki/ # Local configuration file (sdk path, etc) local.properties # Eclipse project files .classpath .project .settings/ # Proguard folder generated by Eclipse proguard/ #Android Studio build/ # Intellij project files *.iml *.ipr *.iws .idea/ #gradle .gradle/ ================================================ FILE: .travis.yml ================================================ language: android android: components: - tools - platform-tools - build-tools-25.0.2 - android-25 - extra-android-support - extra - extra-android-m2repository script: - ./gradlew assembleDebug ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2014 代码家 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # 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). One year ago, I started to make an app named [EverMemo](https://play.google.com/store/apps/details?id=com.zhan_dui.evermemo) with my good friends. The designer gave me a design picture, the design like this: ![](http://ww1.sinaimg.cn/mw690/610dc034jw1ejoquidvvsg208i0630u4.gif) I found it was pretty hard to achieve this effect, cause you had to be very familiar with the Android Touch System. It was beyond my ability that moment, and I also noticed that there was no such a concept library... Time passed, finally...as you see right now. ## Demo ![](http://ww2.sinaimg.cn/mw690/610dc034jw1ejoplapwtqg208n0e74dx.gif) [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. But it only works in `ListView`, and it has too many issues that they never care. What a pity! When I start to make this library, I set some goals: - Can be easily integrated in anywhere, ListView, GridView, ViewGroup etc. - Can receive `onOpen`,`onClose`,`onUpdate` callbacks. - Can notifiy the hidden children how much they have shown. - Can be nested each other. - Can handle complicate situation, just like [this](https://camo.githubusercontent.com/d145d9a9508b3d204b70882c05bc3d9bd433883c/687474703a2f2f7777312e73696e61696d672e636e2f6c617267652f3631306463303334677731656b686f6a7379326172673230386530366e6774312e676966). ## Usage ### Step 1 #### Gradle ```groovy dependencies { 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" } ``` #### Maven ```xml com.google.android support-v4 r6 com.google.android recyclerview-v7 21.0.0 com.daimajia.swipelayout library 1.2.0 apklib ``` #### Eclipse [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 [Go to Wiki](https://github.com/daimajia/AndroidSwipeLayout/wiki) ## About me A student in mainland China. Welcome to [offer me an internship](mailto:daimajia@gmail.com). If you have any new idea about this project, feel free to [contact me](mailto:daimajia@gmail.com). :smiley: ================================================ FILE: build.gradle ================================================ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() maven { url "https://jitpack.io" } } dependencies { 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 } } allprojects { repositories { jcenter() maven { url "https://jitpack.io" } } } ================================================ FILE: demo/.gitignore ================================================ /build ================================================ FILE: demo/build.gradle ================================================ apply plugin: 'com.android.application' repositories { jcenter() } android { compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION defaultConfig { minSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION) targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) versionName project.VERSION_NAME versionCode Integer.parseInt(project.VERSION_CODE) } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } lintOptions { abortOnError false } } dependencies { compile project(":library") 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' } ================================================ FILE: demo/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in /Applications/Android Studio.app/sdk/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles # directive in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} ================================================ FILE: demo/src/main/AndroidManifest.xml ================================================ ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/GridViewExample.java ================================================ package com.daimajia.swipedemo; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.GridView; import com.daimajia.swipe.util.Attributes; import com.daimajia.swipedemo.adapter.GridViewAdapter; public class GridViewExample extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gridview); final GridView gridView = (GridView)findViewById(R.id.gridview); final GridViewAdapter adapter = new GridViewAdapter(this); adapter.setMode(Attributes.Mode.Multiple); gridView.setAdapter(adapter); gridView.setSelected(false); gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { Log.e("onItemLongClick","onItemLongClick:" + position); return false; } }); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Log.e("onItemClick","onItemClick:" + position); } }); gridView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { Log.e("onItemSelected","onItemSelected:" + position); } @Override public void onNothingSelected(AdapterView parent) { } }); } } ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/ListViewExample.java ================================================ 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; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; import com.daimajia.swipe.SwipeLayout; import com.daimajia.swipe.util.Attributes; import com.daimajia.swipedemo.adapter.ListViewAdapter; 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); 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. */ // 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"}; // mListView.setAdapter(new ArraySwipeAdapterSample(this, R.layout.listview_item, R.id.position, adapterData)); mAdapter = new ListViewAdapter(this); mListView.setAdapter(mAdapter); mAdapter.setMode(Attributes.Mode.Single); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { ((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"); return false; } }); mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { Toast.makeText(mContext, "OnItemLongClickListener", Toast.LENGTH_SHORT).show(); return true; } }); mListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { Log.e("ListView", "onScrollStateChanged"); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); mListView.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:"); } }); } @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; } else if (id == R.id.action_recycler) { startActivity(new Intent(this, RecyclerViewExample.class)); finish(); return true; } return super.onOptionsItemSelected(item); } } ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/MyActivity.java ================================================ package com.daimajia.swipedemo; import android.app.Activity; 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; 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.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) { } }); 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 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(); } }); 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.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) { 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.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(); } }); } @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; } 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); } /* 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)))); } } ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/NestedExample.java ================================================ package com.daimajia.swipedemo; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Toast; import com.daimajia.swipe.SwipeLayout; public class NestedExample extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.complicate_layout); SwipeLayout swipeLayout = (SwipeLayout)findViewById(R.id.test_swipe_swipe); swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() { @Override public void onDoubleClick(SwipeLayout layout, boolean surface) { Toast.makeText(getApplicationContext(), "DoubleClick", Toast.LENGTH_SHORT).show(); } }); swipeLayout.findViewById(R.id.trash).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Click", Toast.LENGTH_SHORT).show(); } }); } } ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/RecyclerViewExample.java ================================================ 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); } } ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/adapter/ArraySwipeAdapterSample.java ================================================ package com.daimajia.swipedemo.adapter; import android.content.Context; import com.daimajia.swipe.adapters.ArraySwipeAdapter; import com.daimajia.swipedemo.R; import java.util.List; /** * Sample usage of ArraySwipeAdapter. * @param */ public class ArraySwipeAdapterSample extends ArraySwipeAdapter { public ArraySwipeAdapterSample(Context context, int resource) { super(context, resource); } public ArraySwipeAdapterSample(Context context, int resource, int textViewResourceId) { super(context, resource, textViewResourceId); } public ArraySwipeAdapterSample(Context context, int resource, Object[] objects) { super(context, resource, objects); } public ArraySwipeAdapterSample(Context context, int resource, int textViewResourceId, Object[] objects) { super(context, resource, textViewResourceId, objects); } public ArraySwipeAdapterSample(Context context, int resource, List objects) { super(context, resource, objects); } public ArraySwipeAdapterSample(Context context, int resource, int textViewResourceId, List objects) { super(context, resource, textViewResourceId, objects); } @Override public int getSwipeLayoutResourceId(int position) { return R.id.swipe; } } ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/adapter/GridViewAdapter.java ================================================ package com.daimajia.swipedemo.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.daimajia.swipe.adapters.BaseSwipeAdapter; import com.daimajia.swipedemo.R; public class GridViewAdapter extends BaseSwipeAdapter { private Context mContext; public GridViewAdapter(Context mContext) { this.mContext = mContext; } @Override public int getSwipeLayoutResourceId(int position) { return R.id.swipe; } @Override public View generateView(int position, ViewGroup parent) { return LayoutInflater.from(mContext).inflate(R.layout.grid_item, null); } @Override public void fillValues(int position, View convertView) { TextView t = (TextView)convertView.findViewById(R.id.position); t.setText((position + 1 )+"."); } @Override public int getCount() { return 50; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } } ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/adapter/ListViewAdapter.java ================================================ package com.daimajia.swipedemo.adapter; import android.content.Context; 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.adapters.BaseSwipeAdapter; import com.daimajia.swipedemo.R; public class ListViewAdapter extends BaseSwipeAdapter { private Context mContext; public ListViewAdapter(Context mContext) { this.mContext = mContext; } @Override public int getSwipeLayoutResourceId(int position) { return R.id.swipe; } @Override public View generateView(int position, ViewGroup parent) { View v = LayoutInflater.from(mContext).inflate(R.layout.listview_item, null); SwipeLayout swipeLayout = (SwipeLayout)v.findViewById(getSwipeLayoutResourceId(position)); swipeLayout.addSwipeListener(new SimpleSwipeListener() { @Override public void onOpen(SwipeLayout layout) { YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(layout.findViewById(R.id.trash)); } }); swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() { @Override 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; } @Override public void fillValues(int position, View convertView) { TextView t = (TextView)convertView.findViewById(R.id.position); t.setText((position + 1) + "."); } @Override public int getCount() { return 50; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } } ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewAdapter.java ================================================ 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; } } ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/adapter/util/DividerItemDecoration.java ================================================ 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."); } } } ================================================ FILE: demo/src/main/java/com/daimajia/swipedemo/adapter/util/RecyclerItemClickListener.java ================================================ 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) { } } ================================================ FILE: demo/src/main/res/drawable/dark_gray.xml ================================================ ================================================ FILE: demo/src/main/res/drawable/divider.xml ================================================ ================================================ FILE: demo/src/main/res/drawable/item_selector.xml ================================================ ================================================ FILE: demo/src/main/res/drawable/red.xml ================================================ ================================================ FILE: demo/src/main/res/drawable/white.xml ================================================ ================================================ FILE: demo/src/main/res/layout/complicate_layout.xml ================================================ ================================================ FILE: demo/src/main/res/layout/grid_item.xml ================================================ ================================================ FILE: demo/src/main/res/layout/gridview.xml ================================================ ================================================ FILE: demo/src/main/res/layout/listview.xml ================================================ ================================================ FILE: demo/src/main/res/layout/listview_item.xml ================================================