├── .gitignore ├── README.md ├── build.gradle ├── demo ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── cn │ │ └── bingoogolapple │ │ └── swipeitemlayout │ │ └── demo │ │ ├── activity │ │ ├── ListViewDemoActivity.java │ │ ├── MainActivity.java │ │ ├── RecyclerViewDemoActivity.java │ │ └── SwipeItemActivity.java │ │ ├── adapter │ │ ├── AdapterViewAdapter.java │ │ └── RecyclerViewAdapter.java │ │ ├── engine │ │ └── DataEngine.java │ │ ├── model │ │ └── NormalModel.java │ │ └── widget │ │ └── Divider.java │ └── res │ ├── drawable │ ├── selector_btn_orange.xml │ ├── selector_btn_red.xml │ └── selector_item.xml │ ├── layout │ ├── activity_listview.xml │ ├── activity_main.xml │ ├── activity_recyclerview.xml │ ├── activity_swipeitem.xml │ ├── item_bgaswipe.xml │ ├── item_bgaswipe_bak.xml │ └── item_bgaswipe_bak_gap.xml │ ├── mipmap-hdpi │ ├── avator.png │ ├── delete.png │ ├── ic_launcher.png │ └── list_divider.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── values-v21 │ └── styles.xml │ └── values │ ├── colors.xml │ ├── strings.xml │ ├── styles.xml │ └── styles_base.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── build.gradle ├── gradle.properties └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── cn │ │ └── bingoogolapple │ │ └── swipeitemlayout │ │ └── BGASwipeItemLayout.java │ └── res │ └── values │ └── attrs.xml └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | 15 | # Gradle files 16 | .gradle/ 17 | build/ 18 | /*/build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Eclipse project files 30 | .classpath 31 | .project 32 | .settings/ 33 | 34 | # Intellij project files 35 | *.iml 36 | *.ipr 37 | *.iws 38 | .idea/ 39 | 40 | # Mac system files 41 | .DS_Store 42 | 43 | *.keystore -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | :running:BGASwipeItemLayout-Android:running: 2 | ============ 3 | 4 | [![License](https://img.shields.io/badge/license-Apache%202-green.svg)](https://www.apache.org/licenses/LICENSE-2.0) 5 | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/cn.bingoogolapple/bga-swipeitemlayout/badge.svg)](https://maven-badges.herokuapp.com/maven-central/cn.bingoogolapple/bga-swipeitemlayout) 6 | 7 | 类似iOS带弹簧效果的左右滑动控件,可作为AbsListView和RecyclerView的item。支持给BGASwipeItemLayout和其子控件设置margin和padding属性 8 | 9 | ### 效果图 10 | ![1-event](https://cloud.githubusercontent.com/assets/8949716/17476589/5a35c400-5d93-11e6-9de9-fbf6153dc5f3.gif) 11 | ![2-listview](https://cloud.githubusercontent.com/assets/8949716/17476591/5aad359e-5d93-11e6-9a1c-f96b3e72ce30.gif) 12 | ![3-recyclerview](https://cloud.githubusercontent.com/assets/8949716/17476592/5b5bcb54-5d93-11e6-8a81-34b114c32ca1.gif) 13 | 14 | ### Gradle依赖 15 | 16 | ```groovy 17 | dependencies { 18 | compile 'com.android.support:support-v4:latestVersion' 19 | compile 'cn.bingoogolapple:bga-swipeitemlayout:latestVersion@aar' 20 | } 21 | ``` 22 | 23 | ### BGASwipeItemLayout方法说明 24 | 25 | ```java 26 | /** 27 | * 以动画方式打开 28 | */ 29 | public void openWithAnim() 30 | 31 | /** 32 | * 以动画方式关闭 33 | */ 34 | public void closeWithAnim() 35 | 36 | /** 37 | * 直接打开 38 | */ 39 | public void open() 40 | 41 | /** 42 | * 直接关闭。如果在AbsListView中删除已经打开的item时,请用该方法关闭item,否则重用item时有问题。RecyclerView中可以用该方法,也可以用closeWithAnim 43 | */ 44 | public void close() 45 | 46 | /** 47 | * 当前是否为打开状态 48 | * 49 | * @return 50 | */ 51 | public boolean isOpened() 52 | 53 | /** 54 | * 当前是否为关闭状态 55 | * 56 | * @return 57 | */ 58 | public boolean isClosed() 59 | 60 | /** 61 | * 获取顶部视图 62 | * 63 | * @return 64 | */ 65 | public View getTopView() 66 | 67 | /** 68 | * 获取底部视图 69 | * 70 | * @return 71 | */ 72 | public View getBottomView() 73 | 74 | /** 75 | * 设置是否可滑动 76 | * 77 | * @return 78 | */ 79 | public void setSwipeAble(boolean swipeAble) 80 | ``` 81 | 82 | ### BGASwipeItemLayoutDelegate接口说明 83 | 84 | ```java 85 | /** 86 | * 变为打开状态 87 | * 88 | * @param swipeItemLayout 89 | */ 90 | void onBGASwipeItemLayoutOpened(BGASwipeItemLayout swipeItemLayout); 91 | 92 | /** 93 | * 变为关闭状态 94 | * 95 | * @param swipeItemLayout 96 | */ 97 | void onBGASwipeItemLayoutClosed(BGASwipeItemLayout swipeItemLayout); 98 | 99 | /** 100 | * 从关闭状态切换到正在打开状态 101 | * 102 | * @param swipeItemLayout 103 | */ 104 | void onBGASwipeItemLayoutStartOpen(BGASwipeItemLayout swipeItemLayout); 105 | ``` 106 | 107 | ### 自定义属性说明 108 | 109 | 属性名 | 说明 | 默认值 110 | :----------- | :----------- | :----------- 111 | bga_sil_swipeDirection | 往左滑还是往右滑为打开状态(left或right) | left 112 | bga_sil_bottomMode | 底部视图展现方式(layDown或pullOut) | pullOut 113 | bga_sil_springDistance | 弹簧距离 | 0dp 114 | bga_sil_swipeAble | 是否可左右滑动 | true 115 | 116 | ## 作者联系方式 117 | 118 | | 个人主页 | 邮箱 | 119 | | ------------- | ------------ | 120 | | bingoogolapple.cn | bingoogolapple@gmail.com | 121 | 122 | | 个人微信号 | 微信群 | 公众号 | 123 | | ------------ | ------------ | ------------ | 124 | | 个人微信号 | 微信群 | 公众号 | 125 | 126 | | 个人 QQ 号 | QQ 群 | 127 | | ------------ | ------------ | 128 | | 个人 QQ 号 | QQ 群 | 129 | 130 | ## 打赏支持作者 131 | 132 | 如果您觉得 BGA 系列开源库或工具软件帮您节省了大量的开发时间,可以扫描下方的二维码打赏支持。您的支持将鼓励我继续创作,打赏后还可以加我微信免费开通一年 [上帝小助手浏览器扩展/插件开发平台](https://github.com/bingoogolapple/bga-god-assistant-config) 的会员服务 133 | 134 | | 微信 | QQ | 支付宝 | 135 | | ------------- | ------------- | ------------- | 136 | | 微信 | QQ | 支付宝 | 137 | 138 | ## 作者项目推荐 139 | 140 | * 欢迎您使用我开发的第一个独立开发软件产品 [上帝小助手浏览器扩展/插件开发平台](https://github.com/bingoogolapple/bga-god-assistant-config) 141 | 142 | ## License 143 | 144 | Copyright 2015 bingoogolapple 145 | 146 | Licensed under the Apache License, Version 2.0 (the "License"); 147 | you may not use this file except in compliance with the License. 148 | You may obtain a copy of the License at 149 | 150 | http://www.apache.org/licenses/LICENSE-2.0 151 | 152 | Unless required by applicable law or agreed to in writing, software 153 | distributed under the License is distributed on an "AS IS" BASIS, 154 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 155 | See the License for the specific language governing permissions and 156 | limitations under the License. 157 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.2' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /demo/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion ANDROID_BUILD_SDK_VERSION as int 5 | buildToolsVersion ANDROID_BUILD_TOOLS_VERSION 6 | 7 | defaultConfig { 8 | minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION as int 9 | targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION as int 10 | versionCode VERSION_CODE as int 11 | versionName VERSION_NAME 12 | } 13 | } 14 | 15 | dependencies { 16 | // -------------------- 以下两个库是必须依赖的 ---------------------------- 17 | compile 'com.android.support:support-v4:25.0.1' 18 | compile 'cn.bingoogolapple:bga-swipeitemlayout:1.0.4@aar' 19 | // -------------------- 以上两个库是必须依赖的 ---------------------------- 20 | 21 | 22 | 23 | // 以下几个库是演示案例所使用到的 24 | // compile project(':library') 25 | compile 'com.android.support:appcompat-v7:25.0.1' 26 | compile 'com.android.support:recyclerview-v7:25.0.1' 27 | compile 'cn.bingoogolapple:bga-adapter:1.1.5@aar' 28 | } 29 | -------------------------------------------------------------------------------- /demo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 21 | 24 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/src/main/java/cn/bingoogolapple/swipeitemlayout/demo/activity/ListViewDemoActivity.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.swipeitemlayout.demo.activity; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.AbsListView; 8 | import android.widget.AdapterView; 9 | import android.widget.ListView; 10 | import android.widget.Toast; 11 | 12 | import java.util.List; 13 | 14 | import cn.bingoogolapple.androidcommon.adapter.BGAOnItemChildClickListener; 15 | import cn.bingoogolapple.androidcommon.adapter.BGAOnItemChildLongClickListener; 16 | import cn.bingoogolapple.swipeitemlayout.demo.R; 17 | import cn.bingoogolapple.swipeitemlayout.demo.adapter.AdapterViewAdapter; 18 | import cn.bingoogolapple.swipeitemlayout.demo.engine.DataEngine; 19 | import cn.bingoogolapple.swipeitemlayout.demo.model.NormalModel; 20 | 21 | /** 22 | * 作者:王浩 邮件:bingoogolapple@gmail.com 23 | * 创建时间:15/5/22 10:06 24 | * 描述: 25 | */ 26 | public class ListViewDemoActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener, BGAOnItemChildClickListener, BGAOnItemChildLongClickListener { 27 | private static final String TAG = ListViewDemoActivity.class.getSimpleName(); 28 | private List mData; 29 | private ListView mDataLv; 30 | private AdapterViewAdapter mAdapter; 31 | 32 | @Override 33 | protected void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | setContentView(R.layout.activity_listview); 36 | 37 | initListView(); 38 | } 39 | 40 | private void initListView() { 41 | mDataLv = (ListView) findViewById(R.id.lv_listview_data); 42 | mDataLv.setOnItemClickListener(this); 43 | mDataLv.setOnItemLongClickListener(this); 44 | 45 | mAdapter = new AdapterViewAdapter(this); 46 | mAdapter.setOnItemChildClickListener(this); 47 | mAdapter.setOnItemChildLongClickListener(this); 48 | 49 | mDataLv.setOnScrollListener(new AbsListView.OnScrollListener() { 50 | @Override 51 | public void onScrollStateChanged(AbsListView view, int scrollState) { 52 | if (AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL == scrollState) { 53 | mAdapter.closeOpenedSwipeItemLayoutWithAnim(); 54 | } 55 | } 56 | 57 | @Override 58 | public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 59 | } 60 | }); 61 | 62 | mData = DataEngine.loadNormalModelDatas(); 63 | mAdapter.setData(mData); 64 | mDataLv.setAdapter(mAdapter); 65 | } 66 | 67 | @Override 68 | public void onItemClick(AdapterView parent, View view, int position, long id) { 69 | Toast.makeText(this, "点击了条目 " + mAdapter.getItem(position).mTitle, Toast.LENGTH_SHORT).show(); 70 | } 71 | 72 | @Override 73 | public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { 74 | Toast.makeText(this, "长按了" + mAdapter.getItem(position).mTitle, Toast.LENGTH_SHORT).show(); 75 | return true; 76 | } 77 | 78 | @Override 79 | public void onItemChildClick(ViewGroup parent, View childView, int position) { 80 | if (childView.getId() == R.id.tv_item_bgaswipe_delete) { 81 | // 作为ListView的item使用时,如果删除了某一个item,请先关闭已经打开的item,否则其他item会显示不正常(RecyclerView不会有这个问题) 82 | mAdapter.closeOpenedSwipeItemLayout(); 83 | mAdapter.removeItem(position); 84 | } 85 | } 86 | 87 | @Override 88 | public boolean onItemChildLongClick(ViewGroup parent, View childView, int position) { 89 | if (childView.getId() == R.id.tv_item_bgaswipe_delete) { 90 | Toast.makeText(this, "长按了删除 " + mAdapter.getItem(position).mTitle, Toast.LENGTH_SHORT).show(); 91 | return true; 92 | } 93 | return false; 94 | } 95 | } -------------------------------------------------------------------------------- /demo/src/main/java/cn/bingoogolapple/swipeitemlayout/demo/activity/MainActivity.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.swipeitemlayout.demo.activity; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | 8 | import cn.bingoogolapple.swipeitemlayout.demo.R; 9 | 10 | /** 11 | * 作者:王浩 邮件:bingoogolapple@gmail.com 12 | * 创建时间:15/5/28 10:23 13 | * 描述: 14 | */ 15 | public class MainActivity extends AppCompatActivity { 16 | private static final String TAG = MainActivity.class.getSimpleName(); 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_main); 22 | } 23 | 24 | public void changeToSwipeItemDemo(View v) { 25 | startActivity(new Intent(this, SwipeItemActivity.class)); 26 | } 27 | 28 | public void changeToListViewDemo(View v) { 29 | startActivity(new Intent(this, ListViewDemoActivity.class)); 30 | } 31 | 32 | public void changeToRecyclerViewDemo(View v) { 33 | startActivity(new Intent(this, RecyclerViewDemoActivity.class)); 34 | } 35 | 36 | } -------------------------------------------------------------------------------- /demo/src/main/java/cn/bingoogolapple/swipeitemlayout/demo/activity/RecyclerViewDemoActivity.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.swipeitemlayout.demo.activity; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.support.v7.widget.LinearLayoutManager; 6 | import android.support.v7.widget.RecyclerView; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.Toast; 10 | 11 | import java.util.List; 12 | 13 | import cn.bingoogolapple.androidcommon.adapter.BGAOnItemChildClickListener; 14 | import cn.bingoogolapple.androidcommon.adapter.BGAOnItemChildLongClickListener; 15 | import cn.bingoogolapple.androidcommon.adapter.BGAOnRVItemClickListener; 16 | import cn.bingoogolapple.androidcommon.adapter.BGAOnRVItemLongClickListener; 17 | import cn.bingoogolapple.swipeitemlayout.demo.R; 18 | import cn.bingoogolapple.swipeitemlayout.demo.adapter.RecyclerViewAdapter; 19 | import cn.bingoogolapple.swipeitemlayout.demo.engine.DataEngine; 20 | import cn.bingoogolapple.swipeitemlayout.demo.model.NormalModel; 21 | import cn.bingoogolapple.swipeitemlayout.demo.widget.Divider; 22 | 23 | /** 24 | * 作者:王浩 邮件:bingoogolapple@gmail.com 25 | * 创建时间:15/5/22 10:06 26 | * 描述: 27 | */ 28 | public class RecyclerViewDemoActivity extends AppCompatActivity implements BGAOnRVItemClickListener, BGAOnRVItemLongClickListener, BGAOnItemChildClickListener, BGAOnItemChildLongClickListener { 29 | private static final String TAG = RecyclerViewDemoActivity.class.getSimpleName(); 30 | private RecyclerViewAdapter mAdapter; 31 | private List mData; 32 | private RecyclerView mDataRv; 33 | 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_recyclerview); 38 | 39 | initRecyclerView(); 40 | } 41 | 42 | private void initRecyclerView() { 43 | mDataRv = (RecyclerView) findViewById(R.id.rv_recyclerview_data); 44 | mDataRv.addItemDecoration(new Divider(this)); 45 | 46 | LinearLayoutManager layoutManager = new LinearLayoutManager(this); 47 | layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 48 | mDataRv.setLayoutManager(layoutManager); 49 | 50 | mAdapter = new RecyclerViewAdapter(mDataRv); 51 | mAdapter.setOnRVItemClickListener(this); 52 | mAdapter.setOnRVItemLongClickListener(this); 53 | mAdapter.setOnItemChildClickListener(this); 54 | mAdapter.setOnItemChildLongClickListener(this); 55 | 56 | mDataRv.addOnScrollListener(new RecyclerView.OnScrollListener() { 57 | @Override 58 | public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 59 | if (RecyclerView.SCROLL_STATE_DRAGGING == newState) { 60 | mAdapter.closeOpenedSwipeItemLayoutWithAnim(); 61 | } 62 | } 63 | }); 64 | 65 | mData = DataEngine.loadNormalModelDatas(); 66 | mAdapter.setData(mData); 67 | mDataRv.setAdapter(mAdapter); 68 | } 69 | 70 | @Override 71 | public void onItemChildClick(ViewGroup parent, View childView, int position) { 72 | if (childView.getId() == R.id.tv_item_bgaswipe_delete) { 73 | mAdapter.closeOpenedSwipeItemLayoutWithAnim(); 74 | mAdapter.removeItem(position); 75 | } 76 | } 77 | 78 | @Override 79 | public boolean onItemChildLongClick(ViewGroup parent, View childView, int position) { 80 | if (childView.getId() == R.id.tv_item_bgaswipe_delete) { 81 | Toast.makeText(this, "长按了删除 " + mAdapter.getItem(position).mTitle, Toast.LENGTH_SHORT).show(); 82 | return true; 83 | } 84 | return false; 85 | } 86 | 87 | @Override 88 | public void onRVItemClick(ViewGroup parent, View itemView, int position) { 89 | Toast.makeText(this, "点击了条目 " + mAdapter.getItem(position).mTitle, Toast.LENGTH_SHORT).show(); 90 | } 91 | 92 | @Override 93 | public boolean onRVItemLongClick(ViewGroup parent, View itemView, int position) { 94 | Toast.makeText(this, "长按了条目 " + mAdapter.getItem(position).mTitle, Toast.LENGTH_SHORT).show(); 95 | return true; 96 | } 97 | } -------------------------------------------------------------------------------- /demo/src/main/java/cn/bingoogolapple/swipeitemlayout/demo/activity/SwipeItemActivity.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.swipeitemlayout.demo.activity; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.view.View; 6 | import android.widget.Toast; 7 | 8 | import cn.bingoogolapple.swipeitemlayout.BGASwipeItemLayout; 9 | import cn.bingoogolapple.swipeitemlayout.demo.R; 10 | 11 | public class SwipeItemActivity extends AppCompatActivity { 12 | private BGASwipeItemLayout mTestSil; 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_swipeitem); 18 | mTestSil = (BGASwipeItemLayout) findViewById(R.id.sil_swipeitem_test); 19 | findViewById(R.id.iv_swipeitem_avator).setOnLongClickListener(new View.OnLongClickListener() { 20 | @Override 21 | public boolean onLongClick(View v) { 22 | Toast.makeText(SwipeItemActivity.this, "长按了头像", Toast.LENGTH_SHORT).show(); 23 | return true; 24 | } 25 | }); 26 | findViewById(R.id.iv_swipeitem_delete).setOnLongClickListener(new View.OnLongClickListener() { 27 | @Override 28 | public boolean onLongClick(View v) { 29 | Toast.makeText(SwipeItemActivity.this, "长按了删除", Toast.LENGTH_SHORT).show(); 30 | return true; 31 | } 32 | }); 33 | 34 | mTestSil.setDelegate(new BGASwipeItemLayout.BGASwipeItemLayoutDelegate() { 35 | @Override 36 | public void onBGASwipeItemLayoutOpened(BGASwipeItemLayout swipeItemLayout) { 37 | Toast.makeText(SwipeItemActivity.this, "打开", Toast.LENGTH_SHORT).show(); 38 | } 39 | 40 | @Override 41 | public void onBGASwipeItemLayoutClosed(BGASwipeItemLayout swipeItemLayout) { 42 | Toast.makeText(SwipeItemActivity.this, "关闭", Toast.LENGTH_SHORT).show(); 43 | } 44 | 45 | @Override 46 | public void onBGASwipeItemLayoutStartOpen(BGASwipeItemLayout swipeItemLayout) { 47 | Toast.makeText(SwipeItemActivity.this, "开始打开", Toast.LENGTH_SHORT).show(); 48 | } 49 | 50 | }); 51 | } 52 | 53 | public void onClick(View view) { 54 | switch (view.getId()) { 55 | case R.id.iv_swipeitem_avator: 56 | Toast.makeText(this, "点击了头像", Toast.LENGTH_SHORT).show(); 57 | break; 58 | case R.id.iv_swipeitem_delete: 59 | Toast.makeText(this, "点击了删除", Toast.LENGTH_SHORT).show(); 60 | break; 61 | case R.id.btn_swipeitem_open: 62 | mTestSil.open(); 63 | break; 64 | case R.id.btn_swipeitem_close: 65 | mTestSil.close(); 66 | break; 67 | case R.id.btn_swipeitem_openwithanim: 68 | mTestSil.openWithAnim(); 69 | break; 70 | case R.id.btn_swipeitem_closewithanim: 71 | mTestSil.closeWithAnim(); 72 | break; 73 | case R.id.btn_swipeitem_status: 74 | showStatus(); 75 | break; 76 | } 77 | } 78 | 79 | private void showStatus() { 80 | if (mTestSil.isOpened()) { 81 | Toast.makeText(this, "打开状态", Toast.LENGTH_SHORT).show(); 82 | } else if (mTestSil.isClosed()) { 83 | Toast.makeText(this, "关闭状态", Toast.LENGTH_SHORT).show(); 84 | } 85 | } 86 | } -------------------------------------------------------------------------------- /demo/src/main/java/cn/bingoogolapple/swipeitemlayout/demo/adapter/AdapterViewAdapter.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.swipeitemlayout.demo.adapter; 2 | 3 | import android.content.Context; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import cn.bingoogolapple.androidcommon.adapter.BGAAdapterViewAdapter; 9 | import cn.bingoogolapple.androidcommon.adapter.BGAViewHolderHelper; 10 | import cn.bingoogolapple.swipeitemlayout.BGASwipeItemLayout; 11 | import cn.bingoogolapple.swipeitemlayout.demo.R; 12 | import cn.bingoogolapple.swipeitemlayout.demo.model.NormalModel; 13 | 14 | /** 15 | * 作者:王浩 邮件:bingoogolapple@gmail.com 16 | * 创建时间:15/5/21 上午12:39 17 | * 描述: 18 | */ 19 | public class AdapterViewAdapter extends BGAAdapterViewAdapter { 20 | /** 21 | * 当前处于打开状态的item 22 | */ 23 | private List mOpenedSil = new ArrayList<>(); 24 | 25 | public AdapterViewAdapter(Context context) { 26 | super(context, R.layout.item_bgaswipe); 27 | } 28 | 29 | @Override 30 | protected void setItemChildListener(BGAViewHolderHelper viewHolderHelper) { 31 | BGASwipeItemLayout swipeItemLayout = viewHolderHelper.getView(R.id.sil_item_bgaswipe_root); 32 | swipeItemLayout.setDelegate(new BGASwipeItemLayout.BGASwipeItemLayoutDelegate() { 33 | @Override 34 | public void onBGASwipeItemLayoutOpened(BGASwipeItemLayout swipeItemLayout) { 35 | closeOpenedSwipeItemLayoutWithAnim(); 36 | mOpenedSil.add(swipeItemLayout); 37 | } 38 | 39 | @Override 40 | public void onBGASwipeItemLayoutClosed(BGASwipeItemLayout swipeItemLayout) { 41 | mOpenedSil.remove(swipeItemLayout); 42 | } 43 | 44 | @Override 45 | public void onBGASwipeItemLayoutStartOpen(BGASwipeItemLayout swipeItemLayout) { 46 | closeOpenedSwipeItemLayoutWithAnim(); 47 | } 48 | }); 49 | viewHolderHelper.setItemChildClickListener(R.id.tv_item_bgaswipe_delete); 50 | viewHolderHelper.setItemChildLongClickListener(R.id.tv_item_bgaswipe_delete); 51 | } 52 | 53 | @Override 54 | public void fillData(BGAViewHolderHelper viewHolderHelper, int position, NormalModel model) { 55 | viewHolderHelper.setText(R.id.tv_item_bgaswipe_title, model.mTitle).setText(R.id.tv_item_bgaswipe_detail, model.mDetail).setText(R.id.et_item_bgaswipe_title, model.mTitle); 56 | 57 | BGASwipeItemLayout swipeItemLayout = viewHolderHelper.getView(R.id.sil_item_bgaswipe_root); 58 | if (position % 3 == 0) { 59 | swipeItemLayout.setSwipeAble(false); 60 | } else { 61 | swipeItemLayout.setSwipeAble(true); 62 | } 63 | } 64 | 65 | public void closeOpenedSwipeItemLayoutWithAnim() { 66 | for (BGASwipeItemLayout sil : mOpenedSil) { 67 | sil.closeWithAnim(); 68 | } 69 | mOpenedSil.clear(); 70 | } 71 | 72 | public void closeOpenedSwipeItemLayout() { 73 | for (BGASwipeItemLayout sil : mOpenedSil) { 74 | sil.close(); 75 | } 76 | mOpenedSil.clear(); 77 | } 78 | } -------------------------------------------------------------------------------- /demo/src/main/java/cn/bingoogolapple/swipeitemlayout/demo/adapter/RecyclerViewAdapter.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.swipeitemlayout.demo.adapter; 2 | 3 | import android.support.v7.widget.RecyclerView; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import cn.bingoogolapple.androidcommon.adapter.BGARecyclerViewAdapter; 9 | import cn.bingoogolapple.androidcommon.adapter.BGAViewHolderHelper; 10 | import cn.bingoogolapple.swipeitemlayout.BGASwipeItemLayout; 11 | import cn.bingoogolapple.swipeitemlayout.demo.R; 12 | import cn.bingoogolapple.swipeitemlayout.demo.model.NormalModel; 13 | 14 | /** 15 | * 作者:王浩 邮件:bingoogolapple@gmail.com 16 | * 创建时间:15/5/22 16:31 17 | * 描述: 18 | */ 19 | public class RecyclerViewAdapter extends BGARecyclerViewAdapter { 20 | /** 21 | * 当前处于打开状态的item 22 | */ 23 | private List mOpenedSil = new ArrayList<>(); 24 | 25 | public RecyclerViewAdapter(RecyclerView recyclerView) { 26 | super(recyclerView, R.layout.item_bgaswipe); 27 | } 28 | 29 | @Override 30 | public void setItemChildListener(BGAViewHolderHelper viewHolderHelper, int viewType) { 31 | BGASwipeItemLayout swipeItemLayout = viewHolderHelper.getView(R.id.sil_item_bgaswipe_root); 32 | swipeItemLayout.setDelegate(new BGASwipeItemLayout.BGASwipeItemLayoutDelegate() { 33 | @Override 34 | public void onBGASwipeItemLayoutOpened(BGASwipeItemLayout swipeItemLayout) { 35 | closeOpenedSwipeItemLayoutWithAnim(); 36 | mOpenedSil.add(swipeItemLayout); 37 | } 38 | 39 | @Override 40 | public void onBGASwipeItemLayoutClosed(BGASwipeItemLayout swipeItemLayout) { 41 | mOpenedSil.remove(swipeItemLayout); 42 | } 43 | 44 | @Override 45 | public void onBGASwipeItemLayoutStartOpen(BGASwipeItemLayout swipeItemLayout) { 46 | closeOpenedSwipeItemLayoutWithAnim(); 47 | } 48 | }); 49 | viewHolderHelper.setItemChildClickListener(R.id.tv_item_bgaswipe_delete); 50 | viewHolderHelper.setItemChildLongClickListener(R.id.tv_item_bgaswipe_delete); 51 | } 52 | 53 | @Override 54 | public void fillData(BGAViewHolderHelper viewHolderHelper, int position, NormalModel model) { 55 | viewHolderHelper.setText(R.id.tv_item_bgaswipe_title, model.mTitle).setText(R.id.tv_item_bgaswipe_detail, model.mDetail).setText(R.id.et_item_bgaswipe_title, model.mTitle); 56 | 57 | BGASwipeItemLayout swipeItemLayout = viewHolderHelper.getView(R.id.sil_item_bgaswipe_root); 58 | if (position % 3 == 0) { 59 | swipeItemLayout.setSwipeAble(false); 60 | } else { 61 | swipeItemLayout.setSwipeAble(true); 62 | } 63 | } 64 | 65 | public void closeOpenedSwipeItemLayoutWithAnim() { 66 | for (BGASwipeItemLayout sil : mOpenedSil) { 67 | sil.closeWithAnim(); 68 | } 69 | mOpenedSil.clear(); 70 | } 71 | } -------------------------------------------------------------------------------- /demo/src/main/java/cn/bingoogolapple/swipeitemlayout/demo/engine/DataEngine.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.swipeitemlayout.demo.engine; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import cn.bingoogolapple.swipeitemlayout.demo.model.NormalModel; 7 | 8 | /** 9 | * 作者:王浩 邮件:bingoogolapple@gmail.com 10 | * 创建时间:15/5/26 上午1:03 11 | * 描述: 12 | */ 13 | public class DataEngine { 14 | 15 | public static List loadNormalModelDatas() { 16 | List datas = new ArrayList<>(); 17 | for (int i = 0; i < 20; i++) { 18 | if (i % 4 == 0) { 19 | datas.add(new NormalModel("标题" + i, "我是短的描述" + i)); 20 | } else { 21 | datas.add(new NormalModel("标题" + i, "我是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的描述" + i)); 22 | } 23 | } 24 | return datas; 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /demo/src/main/java/cn/bingoogolapple/swipeitemlayout/demo/model/NormalModel.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.swipeitemlayout.demo.model; 2 | 3 | /** 4 | * 作者:王浩 邮件:bingoogolapple@gmail.com 5 | * 创建时间:15/5/21 14:53 6 | * 描述: 7 | */ 8 | public class NormalModel { 9 | public String mTitle; 10 | public String mDetail; 11 | 12 | public NormalModel(String title, String detail) { 13 | mTitle = title; 14 | mDetail = detail; 15 | } 16 | } -------------------------------------------------------------------------------- /demo/src/main/java/cn/bingoogolapple/swipeitemlayout/demo/widget/Divider.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.swipeitemlayout.demo.widget; 2 | 3 | import android.content.Context; 4 | import android.graphics.Canvas; 5 | import android.graphics.Rect; 6 | import android.graphics.drawable.Drawable; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.View; 9 | 10 | import cn.bingoogolapple.swipeitemlayout.demo.R; 11 | 12 | public class Divider extends RecyclerView.ItemDecoration { 13 | private Drawable mDividerDrawable; 14 | 15 | public Divider(Context context) { 16 | mDividerDrawable = context.getResources().getDrawable(R.mipmap.list_divider); 17 | } 18 | 19 | // 如果等于分割线的宽度或高度的话可以不用重写该方法 20 | @Override 21 | public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 22 | if (parent.getChildAdapterPosition(view) == parent.getAdapter().getItemCount() - 1) { 23 | outRect.set(0, 0, 0, 0); 24 | } else { 25 | outRect.set(0, 0, 0, mDividerDrawable.getIntrinsicHeight()); 26 | } 27 | } 28 | 29 | @Override 30 | public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { 31 | drawVertical(c, parent); 32 | } 33 | 34 | public void drawVertical(Canvas c, RecyclerView parent) { 35 | int left = parent.getPaddingLeft(); 36 | int right = parent.getWidth() - parent.getPaddingRight(); 37 | View child; 38 | RecyclerView.LayoutParams layoutParams; 39 | int top; 40 | int bottom; 41 | int childCount = parent.getChildCount(); 42 | for (int i = 0; i < childCount - 1; i++) { 43 | child = parent.getChildAt(i); 44 | layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); 45 | top = child.getBottom() + layoutParams.bottomMargin; 46 | bottom = top + mDividerDrawable.getIntrinsicHeight(); 47 | mDividerDrawable.setBounds(left, top, right, bottom); 48 | mDividerDrawable.draw(c); 49 | } 50 | } 51 | 52 | } -------------------------------------------------------------------------------- /demo/src/main/res/drawable/selector_btn_orange.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable/selector_btn_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable/selector_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_listview.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 |