diff --git a/.gitignore b/.gitignore index 78a688b9cb15d525895670430e808d56099cbc27..f1f83f4d886c82e621880d4ae1d8636517011e8d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,16 @@ +*.iml .gradle /local.properties -/.idea/workspace.xml +/.idea/caches /.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml .DS_Store /build /captures -/.gradle/ -/.idea/ -/.settings/ -/projectFilesBackup/ +.externalNativeBuild +/entry/.preview +.cxx +upload.gradle diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser deleted file mode 100644 index 17a11782c5a224c03fc725f7091cbc5c6312ac0c..0000000000000000000000000000000000000000 Binary files a/.idea/caches/build_file_checksums.ser and /dev/null differ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 30aa626c23142d59e94cc76327172301f159b618..0000000000000000000000000000000000000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index fd5caf2bb3104c30685f58a7b9a06d1faa6a7fc4..0000000000000000000000000000000000000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml deleted file mode 100644 index 8d6f051bc53c12d3c44d83f29b218d911e760d4b..0000000000000000000000000000000000000000 --- a/.idea/markdown-navigator.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml deleted file mode 100644 index 57927c5a72b6696671ef9629d3734dda9d5f96b0..0000000000000000000000000000000000000000 --- a/.idea/markdown-navigator/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index b0c7b20c87d2e5afd25686dcaa9ee52b675d4978..0000000000000000000000000000000000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 7cec3b7ea12fdc925bb23acd19e428656cccb2a5..0000000000000000000000000000000000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460d8b38ac04e3a3224d7c79ef719b1991a9..0000000000000000000000000000000000000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfbbc029bcab630581847471d7f238ec53..0000000000000000000000000000000000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.project b/.project deleted file mode 100644 index 89b5c488c1594cfb516d706c3a518c5c256cdcf3..0000000000000000000000000000000000000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - ExpandableSwipeListView - Project ExpandableSwipeListView created by Buildship. - - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - - org.eclipse.buildship.core.gradleprojectnature - - diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index e8895216fd3c0c3af4c4522334775f41b7deb42e..0000000000000000000000000000000000000000 --- a/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -connection.project.dir= -eclipse.preferences.version=1 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..b5e3ed733cd5da544cb6ba2f67f2e8bd10726734 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +## 0.0.1-SNAPSHOT + ohos 第一个版本 + +* 实现了原库大部分功能 +* ohos无法引用不了第三方依赖,导致listview和RECYCLEVIEW无法下拉刷新,ohos的ToastDialog提示会影响主功能,所以取消了连贯性的提示 \ No newline at end of file diff --git a/ExpandableSwipeListView.iml b/ExpandableSwipeListView.iml deleted file mode 100644 index 3067910bb43b8ba1a19bf936033d258c4dd57761..0000000000000000000000000000000000000000 --- a/ExpandableSwipeListView.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE diff --git a/README.OPENSOURCE b/README.OPENSOURCE new file mode 100644 index 0000000000000000000000000000000000000000..9473d24ef3d32da8e3c963787722bd92637364f4 --- /dev/null +++ b/README.OPENSOURCE @@ -0,0 +1,19 @@ +[ + + { + + "Name": "TimeLine", + + "License": "Apache License", + + "License File": "LICENSE", + + "Version Number": "3.0", + + "Upstream URL": "https://github.com/ditclear/TimeLine", + + "Description": "提供了左右滑动功能,并支持回弹效果和自定义设置滑动距离和是否开启滑动" + + } + +] \ No newline at end of file diff --git a/README.md b/README.md index 3d7d15a4e491f752cecda84fdec9a1027246c7b7..a035c4072bac914d96f7dd126ef3c693ea1cbadb 100644 --- a/README.md +++ b/README.md @@ -1,148 +1,188 @@ # TimeLine -![](https://img.shields.io/badge/minSdk-17-brightgreen.svg) ![](https://img.shields.io/badge/version-1.1.0-green.svg) ![](https://img.shields.io/badge/star-375-blue.svg) ![](https://img.shields.io/badge/fork-91-blue.svg) -> 提供了仿IOS的越界回弹效果和左右滑动功能,可自由设置最小滑动距离和是否开启滑动功能 +## 项目介绍 +- 项目名称:TimeLine +- 所属系列:openharmony的第三方组件适配移植 +- 功能:提供了左右滑动功能,并支持回弹效果和自定义设置滑动距离和是否开启滑动 +- 项目移植状态:主功能完成 +- 调用差异:ohos无法引用不了第三方依赖,导致listview和RECYCLEVIEW无法下拉刷新,ohos的ToastDialog提示会影响主功能,所以取消了连贯性的提示 +- 开发版本:sdk6,DevEco Studio 2.2 Beta1 +- 基线版本:Release 3.0 +## 效果演示 + + +## 安装教程 +1.在项目根目录下的build.gradle文件中 -示例:[demo.apk](apk/timeline.apk) - -#### Download - implementation 'com.ditclear:swipedraglayout:1.1.0' - -#### 截图 - -![](screenshot/feature.gif) ![](screenshot/modify.gif) - -![](screenshot/recyclerview.gif) ![](screenshot/listview.gif) +``` +allprojects { + repositories { + maven { + url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' + } + } +} +``` +2.在entry模块的build.gradle文件中, +``` +dependencies { + implementation('com.gitee.chinasoft_ohos:TimeLine:0.0.1-SNAPSHOT') + ...... + } + ``` + 在sdk6,DevEco Studio 2.2 Beta1下项目可直接运行 如无法运行,删除项目.gradle,.idea,build,gradle,build.gradle文件, 并依据自己的版本创建新项目,将新项目的对应文件复制到根目录下 +## 使用说明 +``` +1、xml中定义如下 -### Feature + + + + + + + + + + + + + + + + +``` -- [SwipeDragLayout](https://github.com/vienan/TimeLine/blob/master/swipelayout/src/main/java/com/ditclear/swipelayout/SwipeDragLayout.java)使用ViewDragHelper来进行滑动操作,代码少,易理解,核心代码不过150行 -- 使用了保留一个静态类的方法来确保只有一个展开,并在`onDetachedFromWindow`方法中进行关闭操作 -- 提供了多种自定义属性,见下表 -- [sample](https://github.com/ditclear/SwipeLayout/blob/8d5cfdce76249150b3c37c72cd0a600138fe00d8/app/src/main/java/vienan/app/expandableswipelistview/RecyclerActivity.java)使用了DataBinding和kotlin 进行了多类型的绑定,对于了解和使用DataBinding大有益处,添加多种Type更是十分简单,再也不用extends RecyclerView.Adapter了,可以参考[BindingListAdapter](https://github.com/ditclear/BindingListAdapter) +``` + 2、动态设置API + .setOhos(boolean); // 回弹是否开启 -#### 自定义属性 + .setSwipeDirection("") // left || right 滑动方向 -| attr | type | default | meaning | -| --------------- | :-----: | ------: | :-----------------------: | -| need_offset | float | 0.2f | 最小需要滑动的比例 | -| ios | boolean | true | 拖动越界回弹效果 | -| swipe_enable | boolean | true | 开启滑动 | -| swipe_direction | enum | left | 滑动方向,默认1是左滑left,2为右滑right | + .setSwipeEnable(boolean) //是否可以滑动 -#### 示例 + .setNeedOffset(int) // 滑动距离 -```xml - - - - - - - - - - - - - - - - -``` + (1)仅针对ListContaineriter滑动时的回调 -> 注意 + public interface SwipeListContainerListener { + /** + * 开启 + * + * @param swipeDragLayout this + */ + void openSwipe(SwipeDragLayout swipeDragLayout); -暂时只支持两个子View,一个content,一个侧滑的menu,以后会支持 + /** + * 点击 + * + * @param swipeDragLayout this + */ + void clickSwipe(SwipeDragLayout swipeDragLayout); + } -#### 回调监听 + (2)进行其他动画的回调 -```java public interface SwipeListener { - /** * 拖动中,可根据offset 进行其他动画 - * @param layout - * @param offsetRatio 偏移相对于menu宽度的比例 + * + * @param layout this + * @param offsetRatio 偏移相对于menu宽度的比例 * @param offset 偏移量px */ - void onUpdate(SwipeDragLayout layout, float offsetRatio, float offset); + void onUpdate(SwipeDragLayout layout, double offsetRatio, float offset); /** * 展开完成 - * @param layout + * + * @param layout this */ void onOpened(SwipeDragLayout layout); /** * 关闭完成 - * @param layout + * + * @param layout this */ void onClosed(SwipeDragLayout layout); } + ``` +3、xml属性API + +| AttrSet | type | default | meaning | +| --------------- | :-----: | ------: | :-----------------------: | +| need_offset | int | 100 | 最小滑动比例 | +| spring_back | boolean | true | 拖动越界回弹效果 | +| swipe_enable | boolean | true | 开启滑动 | +| swipe_direction | string | left | 滑动方向,默认left,右滑:right | + +## 测试信息 +CodeCheck代码测试无异常 + +CloudTest代码测试无异常 + +病毒安全检测通过 -### License +当前版本demo功能与原组件基本无差异 + +## 版本迭代 +* 0.0.1-SNAPSHOT + +## 版权和许可信息 +``` -```txt Copyright 2018 ditclear Licensed under the Apache License, Version 2.0 (the "License"); @@ -156,5 +196,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -``` diff --git a/apk/timeline.apk b/apk/timeline.apk deleted file mode 100644 index db4160fb4a9e824b9df965c28fbaa8c3358161b5..0000000000000000000000000000000000000000 Binary files a/apk/timeline.apk and /dev/null differ diff --git a/app/.classpath b/app/.classpath deleted file mode 100644 index eb19361b5711e614b090eac2f1b51309da2ec1e4..0000000000000000000000000000000000000000 --- a/app/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/app/.project b/app/.project deleted file mode 100644 index ac485d7c3e627d997f59da65ac961160079a0143..0000000000000000000000000000000000000000 --- a/app/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - app - Project app created by Buildship. - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.buildship.core.gradleprojectnature - - diff --git a/app/.settings/org.eclipse.buildship.core.prefs b/app/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index b1886adb46c085de842f1283c1a3c25151bfc988..0000000000000000000000000000000000000000 --- a/app/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -connection.project.dir=.. -eclipse.preferences.version=1 diff --git a/app/app.iml b/app/app.iml deleted file mode 100644 index e573124821dfee910e34815a89c61dbdda133961..0000000000000000000000000000000000000000 --- a/app/app.iml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f75fa8503e76840fdc32361fe7584907b82b1dcb..f20c3e631f9efdb8c907493c3eb0ac2ca8ae7b9e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,57 +1,27 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-kapt' - -android { - compileSdkVersion 27 - buildToolsVersion "27.0.3" - +apply plugin: 'com.huawei.ohos.hap' +apply plugin: 'com.huawei.ohos.decctest' +ohos { + compileSdkVersion 6 defaultConfig { - applicationId "vienan.app.expandableswipelistview" - minSdkVersion 17 - targetSdkVersion 26 - versionCode 1 - versionName "1.0" + compatibleSdkVersion 5 } buildTypes { release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } } } - lintOptions { - abortOnError false - } - dataBinding { - enabled = true - } - configurations.all { - resolutionStrategy.force 'com.google.code.findbugs:jsr305:2.0.1' - resolutionStrategy.force "com.android.support:support-annotations:27.1.1" - resolutionStrategy.force "com.android.support:palette-v7:27.1.1" - resolutionStrategy.force "com.android.support:support-compact:27.1.1" - resolutionStrategy.force "com.android.support:support-vector-drawable:27.1.1" - resolutionStrategy.force "com.android.support:design:27.1.1" - } } dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - //data binding - kapt "com.android.databinding:compiler:3.1.2" - - implementation 'com.android.support.constraint:constraint-layout:1.1.0' - implementation 'com.android.support:appcompat-v7:27.1.1' - implementation 'com.android.support:cardview-v7:27.1.1' - implementation project(':swipelayout') - implementation 'com.android.support:recyclerview-v7:27.1.1' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'com.github.material-foundation.material-remixer-android:remixer:1.0' - kapt 'com.github.material-foundation.material-remixer-android:remixer_annotation:1.0' - - implementation 'com.github.Yalantis:pull-to-make-soup:1.0.2' + implementation project(path: ':swipelayout') + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testImplementation 'junit:junit:4.13' + ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.200' } -repositories { - mavenCentral() +decc { + supportType = ['html', 'xml'] } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 2f835d3f83789dc031413897f0dee9631f00af89..f7666e47561d514b2a76d5a7dfbb43ede86da92a 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,17 +1 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in D:\android_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 *; -#} +# config module specific ProGuard rules here. \ No newline at end of file diff --git a/app/src/androidTest/java/vienan/app/expandableswipelistview/ApplicationTest.java b/app/src/androidTest/java/vienan/app/expandableswipelistview/ApplicationTest.java deleted file mode 100644 index 6d1d943185f0c4371889b5775e19c4836a728a6f..0000000000000000000000000000000000000000 --- a/app/src/androidTest/java/vienan/app/expandableswipelistview/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package vienan.app.expandableswipelistview; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml deleted file mode 100644 index 1d2646ed9e95f3b2629fd724bfca21e779d5dbe3..0000000000000000000000000000000000000000 --- a/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/config.json b/app/src/main/config.json new file mode 100644 index 0000000000000000000000000000000000000000..6bb9ac1aee4ea43ebdad9a0548beeaa4a0876671 --- /dev/null +++ b/app/src/main/config.json @@ -0,0 +1,72 @@ +{ + "app": { + "bundleName": "vienan.app.expandableswipelistview", + "vendor": "app", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "vienan.app.expandableswipelistview", + "name": ".MyApplication", + "mainAbility": "vienan.app.expandableswipelistview.MainAbility", + "deviceType": [ + "phone" + ], + "metaData": { + "customizeData": [ + { + "name": "hwc-theme", + "value": "androidhwext:style/Theme.Emui.NoTitleBar" + } + ] + }, + "distro": { + "deliveryWithInstall": true, + "moduleName": "app", + "moduleType": "entry", + "installationFree": false + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "name": "vienan.app.expandableswipelistview.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:entry_MainAbility", + "type": "page", + "launchType": "standard" + }, + { + "orientation": "unspecified", + "name": "vienan.app.expandableswipelistview.DemoListAbility", + "icon": "$media:icon", + "description": "$string:demolistability_description", + "label": "$string:app_DemoListAbility", + "type": "page", + "launchType": "standard" + }, + { + "orientation": "unspecified", + "name": "vienan.app.expandableswipelistview.RecycleAbility", + "icon": "$media:icon", + "description": "$string:recycleability_description", + "label": "$string:app_RecycleAbility", + "type": "page", + "launchType": "standard" + } + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/vienan/app/expandableswipelistview/DataBean.java b/app/src/main/java/vienan/app/expandableswipelistview/DataBean.java new file mode 100644 index 0000000000000000000000000000000000000000..fd076ebc18d34eec39b8bf643919cdbb0132f837 --- /dev/null +++ b/app/src/main/java/vienan/app/expandableswipelistview/DataBean.java @@ -0,0 +1,48 @@ +package vienan.app.expandableswipelistview; + +public class DataBean { + private String mData; + private boolean isSlide; + + /** + * 构造 + * + * @param data 数据 + * @param isSlide 是否 + */ + public DataBean(String data, boolean isSlide) { + this.mData = data; + this.isSlide = isSlide; + } + + /** + * 获取 + * + * @return 字符串 + */ + public String getmData() { + return mData; + } + + /** + * 获取 + * + * @param data 字符串 + */ + public void setmData(String data) { + this.mData = data; + } + + public boolean isSlide() { + return isSlide; + } + + public void setSlide(boolean slide) { + isSlide = slide; + } + + @Override + public String toString() { + return mData; + } +} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/DemoListAbility.java b/app/src/main/java/vienan/app/expandableswipelistview/DemoListAbility.java new file mode 100644 index 0000000000000000000000000000000000000000..5b1b3d1e72fbbf326f355b5b3da97e98330c9653 --- /dev/null +++ b/app/src/main/java/vienan/app/expandableswipelistview/DemoListAbility.java @@ -0,0 +1,37 @@ +package vienan.app.expandableswipelistview; + +import ohos.aafwk.ability.Ability; +import ohos.aafwk.content.Intent; +import ohos.agp.components.ListContainer; +import ohos.agp.components.Text; +import ohos.agp.utils.Color; + +import java.util.ArrayList; +import java.util.List; + +public class DemoListAbility extends Ability { + private List mData = new ArrayList<>(); + private ListContainer mList; + + @Override + public void onStart(Intent intent) { + getWindow().setStatusBarColor(Color.getIntColor("#303F9F")); + super.onStart(intent); + super.setUIContent(ResourceTable.Layout_ability_demo_list); + mList = (ListContainer) findComponentById(ResourceTable.Id_list); + Text mTitle = (Text) findComponentById(ResourceTable.Id_title); + mTitle.setText("ListView"); + initData(); + } + + private void initData() { + for (int i = 0; i <= 29; i++) { + mData.add("item " + i); + } + DempItemProvider dempItemProvider = new DempItemProvider(mData, this); + mList.setItemProvider(dempItemProvider); + mList.setBoundarySwitch(true); + mList.setBoundaryColor(new Color(Color.getIntColor("#D6D7D7"))); + mList.setLongClickable(false); + } +} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/DemoListActivity.java b/app/src/main/java/vienan/app/expandableswipelistview/DemoListActivity.java deleted file mode 100644 index 75523c72ecf04ed8d392df2f1b25be7e9a8c8705..0000000000000000000000000000000000000000 --- a/app/src/main/java/vienan/app/expandableswipelistview/DemoListActivity.java +++ /dev/null @@ -1,166 +0,0 @@ -package vienan.app.expandableswipelistview; - -import android.databinding.DataBindingUtil; -import android.graphics.Color; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; -import android.widget.Toast; - -import com.ditclear.swipelayout.SwipeDragLayout; -import com.yalantis.pulltomakesoup.PullToRefreshView; - -import java.util.ArrayList; -import java.util.List; - -import vienan.app.expandableswipelistview.databinding.ListActivityBinding; - -/** - * 页面描述:DemoListActivity - * - * Created by ditclear on 2018/1/5. - */ - -public class DemoListActivity extends AppCompatActivity implements PullToRefreshView.OnRefreshListener { - - ListActivityBinding mBinding; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mBinding = DataBindingUtil.setContentView(this, R.layout.list_activity); - getSupportActionBar().setTitle("ListView"); - final List mList = fakeData(); - mBinding.refreshLayout.setOnRefreshListener(this); - mBinding.list.setAdapter( - new ArrayAdapter(this, R.layout.child_status_item, R.id.tv_title, - mList) { - @NonNull - @Override - public View getView(final int position, @Nullable View convertView, - @NonNull ViewGroup parent) { - MyViewHolder myViewHolder; - if (convertView != null) { - myViewHolder = (MyViewHolder) convertView.getTag(); - } else { - convertView = LayoutInflater.from(getContext()).inflate( - R.layout.child_status_item, null); - myViewHolder = new MyViewHolder(convertView); - convertView.setTag(myViewHolder); - } - - - render(position, myViewHolder); - return convertView; - } - - private void render(final int position, final MyViewHolder myViewHolder) { - if (position % 2 == 0) { - myViewHolder.layout.setSwipeDirection(SwipeDragLayout.DIRECTION_LEFT); - myViewHolder.menuLayout.setLayoutDirection( - LinearLayout.LAYOUT_DIRECTION_LTR); - myViewHolder.layout.setBackgroundColor(Color.parseColor("#FF6347")); - - } else { - myViewHolder.menuLayout.setLayoutDirection( - LinearLayout.LAYOUT_DIRECTION_RTL); - myViewHolder.layout.setSwipeDirection(SwipeDragLayout.DIRECTION_RIGHT); - myViewHolder.layout.setBackgroundColor(Color.parseColor("#FF6347")); - - } - myViewHolder.mTextView.setText(mList.get(position)); - myViewHolder.mTextView.setOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(v.getContext(), - myViewHolder.mTextView.getText(), - Toast.LENGTH_SHORT).show(); - } - }); - myViewHolder.mImageView.setOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(v.getContext(), "edit", - Toast.LENGTH_SHORT).show(); - } - }); - - myViewHolder.deleteIv.setOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(v.getContext(), "delete "+mList.get(position), - Toast.LENGTH_SHORT).show(); - myViewHolder.layout.close(); - mList.remove(position); - notifyDataSetChanged(); - } - }); - myViewHolder.starIv.setOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(v.getContext(), "star", - Toast.LENGTH_SHORT).show(); - } - }); - } - - }); - } - - - /** - * @return 测试数据集 - */ - List fakeData() { - List items = new ArrayList<>(); - for (int i = 0; i < 30; i++) { - String lineItem = "Item " + i; - - items.add(lineItem); - } - return items; - } - - @Override - public void onRefresh() { - mBinding.refreshLayout.postDelayed(new Runnable() { - @Override - public void run() { - mBinding.refreshLayout.setRefreshing(false); - } - },2000); - } - - static class MyViewHolder { - - public TextView mTextView; - public ImageView mImageView; - public ImageView deleteIv; - public ImageView starIv; - public SwipeDragLayout layout; - public LinearLayout menuLayout; - - public MyViewHolder(View itemView) { - mTextView = itemView.findViewById(R.id.tv_title); - mImageView = itemView.findViewById(R.id.iv_type); - deleteIv = itemView.findViewById(R.id.trash); - starIv = itemView.findViewById(R.id.star); - layout = (SwipeDragLayout) itemView; - menuLayout = (LinearLayout) itemView.findViewById(R.id.menu_layout); - } - - } - -} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/DempItemProvider.java b/app/src/main/java/vienan/app/expandableswipelistview/DempItemProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..9579e1a57492cd6558c44f65246831122f1b4cf3 --- /dev/null +++ b/app/src/main/java/vienan/app/expandableswipelistview/DempItemProvider.java @@ -0,0 +1,103 @@ +package vienan.app.expandableswipelistview; + +import com.ditclear.swipelayout.SwipeDragLayout; +import ohos.agp.components.*; +import ohos.app.Context; + +import java.util.List; + +public class DempItemProvider extends BaseItemProvider { + private List list; + private Context mContext; + private boolean isItemEnabled; + private SwipeDragLayout mSwipeLayout; + + /** + * 构造 + * + * @param list 数据 + * @param context 上下文 + */ + public DempItemProvider(List list, Context context) { + this.list = list; + this.mContext = context; + } + + @Override + public int getCount() { + return list == null ? 0 : list.size(); + } + + @Override + public Object getItem(int position) { + if (list != null && position >= 0 && position < list.size()) { + return list.get(position); + } + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public Component getComponent(int position, Component convertComponent, ComponentContainer componentContainer) { + convertComponent = LayoutScatter.getInstance(mContext).parse(ResourceTable.Layout_list_item, null, false); + Text text = (Text) convertComponent.findComponentById(ResourceTable.Id_tv_title); + text.setText(list.get(position)); + SwipeDragLayout swipeDragLayout = (SwipeDragLayout) convertComponent.findComponentById(ResourceTable.Id_swipe); + convertComponent.findComponentById(ResourceTable.Id_iv_type).setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + ToastTool.showText(mContext, "edit"); + } + }); + convertComponent.findComponentById(ResourceTable.Id_tv_title).setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + if (!isItemEnabled) { + ToastTool.showText(mContext, list.get(position)); + } + isItemEnabled = false; + } + }); + convertComponent.findComponentById(ResourceTable.Id_dele).setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + ToastTool.showText(mContext, "delete " + list.get(position)); + list.remove(position); + mSwipeLayout.setListSlideDown(); + notifyDataChanged(); + } + }); + convertComponent.findComponentById(ResourceTable.Id_start).setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + ToastTool.showText(mContext,"star"); + } + }); + if (position % 2 == 0) { + swipeDragLayout.setSwipeDirection("left"); + } else { + swipeDragLayout.setSwipeDirection("right"); + } + + swipeDragLayout.setSwipeListContainerListener(new SwipeDragLayout.SwipeListContainerListener() { + @Override + public void openSwipe(SwipeDragLayout swipeDragLayout) { + mSwipeLayout = swipeDragLayout; + isItemEnabled = true; + } + + @Override + public void clickSwipe(SwipeDragLayout swipeDragLayout) { + if (mSwipeLayout != null && mSwipeLayout != swipeDragLayout) { + mSwipeLayout.setListSlideDown(); + mSwipeLayout = null; + } + } + }); + return convertComponent; + } +} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/MainAbility.java b/app/src/main/java/vienan/app/expandableswipelistview/MainAbility.java new file mode 100644 index 0000000000000000000000000000000000000000..cd055455fb3b965cd23bbeb504b502071fcc48ed --- /dev/null +++ b/app/src/main/java/vienan/app/expandableswipelistview/MainAbility.java @@ -0,0 +1,147 @@ +package vienan.app.expandableswipelistview; + +import com.ditclear.swipelayout.SwipeDragLayout; + +import ohos.aafwk.ability.Ability; +import ohos.aafwk.content.Intent; +import ohos.aafwk.content.Operation; +import ohos.agp.colors.RgbColor; +import ohos.agp.components.*; +import ohos.agp.components.element.ShapeElement; +import ohos.agp.utils.Color; +import ohos.agp.utils.LayoutAlignment; +import ohos.agp.window.dialog.PopupDialog; + +public class MainAbility extends Ability implements Component.ClickedListener, ProgressBar.BarObserver { + private Text mProgress; + private PopupDialog popupDialog; + private SwipeDragLayout mSwipe; + private boolean isSpringBack = true; + private boolean isSlide = true; + private boolean isSlideLr = true; + private int mTextProgress = 2; + + @Override + public void onStart(Intent intent) { + getWindow().setStatusBarColor(Color.getIntColor("#303F9F")); + super.onStart(intent); + super.setUIContent(ResourceTable.Layout_ability_main); + findComponentById(ResourceTable.Id_list_btn).setClickedListener(this); + findComponentById(ResourceTable.Id_recy_btn).setClickedListener(this); + findComponentById(ResourceTable.Id_iv_type).setClickedListener(this); + findComponentById(ResourceTable.Id_tv_title).setClickedListener(this); + findComponentById(ResourceTable.Id_dele).setClickedListener(this); + findComponentById(ResourceTable.Id_start).setClickedListener(this); + findComponentById(ResourceTable.Id_btn).setClickedListener(this); + mSwipe = (SwipeDragLayout) findComponentById(ResourceTable.Id_swipe); + } + + @Override + public void onClick(Component component) { + switch (component.getId()) { + case ResourceTable.Id_list_btn: + startIntent(DemoListAbility.class.getName()); + break; + case ResourceTable.Id_recy_btn: + startIntent(RecycleAbility.class.getName()); + break; + case ResourceTable.Id_iv_type: + ToastTool.showToast(this, "edit"); + break; + case ResourceTable.Id_tv_title: + ToastTool.showToast(this, "this is content"); + break; + case ResourceTable.Id_dele: + ToastTool.showToast(this, "delete"); + break; + case ResourceTable.Id_start: + ToastTool.showToast(this, "star"); + break; + case ResourceTable.Id_btn: + DirectionalLayout layout = (DirectionalLayout) LayoutScatter.getInstance(this) + .parse(ResourceTable.Layout_layout_popudialog, null, false); + popupDialog = new PopupDialog(this, layout, DirectionalLayout.LayoutConfig.MATCH_PARENT, + DirectionalLayout.LayoutConfig.MATCH_CONTENT); + mProgress = (Text) layout.findComponentById(ResourceTable.Id_progress); + Slider mSlider = (Slider) layout.findComponentById(ResourceTable.Id_slideProgress); + layout.findComponentById(ResourceTable.Id_finsh).setClickedListener(this); + mProgress.setText(mTextProgress + ".0"); + mSlider.setProgressValue(mTextProgress); + mSwipe.setNeedOffset(mTextProgress); + checkBtn(layout); + sliderColor(mSlider); + popupDialog.setCustomComponent(layout); + popupDialog.setBackColor(Color.TRANSPARENT); + popupDialog.setArrowSize(50, 30); + popupDialog.setArrowOffset(100); + popupDialog.setHasArrow(true); + popupDialog.setAutoClosable(true); + popupDialog.showOnCertainPosition(LayoutAlignment.BOTTOM, 0, 0); + break; + case ResourceTable.Id_finsh: + popupDialog.destroy(); + break; + default: + break; + } + } + + private void startIntent(String title) { + Intent intent = new Intent(); + Operation operation = new Intent.OperationBuilder() + .withDeviceId("") + .withBundleName(getBundleName()) + .withAbilityName(title) + .build(); + intent.setOperation(operation); + startAbility(intent); + } + + private void checkBtn(DirectionalLayout layout) { + Checkbox btnBack = (Checkbox) layout.findComponentById(ResourceTable.Id_back_btn); + btnBack.setChecked(isSpringBack); + btnBack.setCheckedStateChangedListener(new AbsButton.CheckedStateChangedListener() { + @Override + public void onCheckedChanged(AbsButton absButton, boolean isCheck) { + mSwipe.setOhos(isCheck); + isSpringBack = isCheck; + } + }); + Checkbox btnBack2 = (Checkbox) layout.findComponentById(ResourceTable.Id_back_btn2); + btnBack2.setChecked(isSlideLr); + btnBack2.setCheckedStateChangedListener(new AbsButton.CheckedStateChangedListener() { + @Override + public void onCheckedChanged(AbsButton absButton, boolean isCheck) { + mSwipe.setListSlideDown(); + mSwipe.setSwipeDirection(isCheck ? "left" : "right"); + isSlideLr = isCheck; + } + }); + Checkbox btnBack3 = (Checkbox) layout.findComponentById(ResourceTable.Id_back_btn3); + btnBack3.setChecked(isSlide); + btnBack3.setCheckedStateChangedListener(new AbsButton.CheckedStateChangedListener() { + @Override + public void onCheckedChanged(AbsButton absButton, boolean isCheck) { + mSwipe.setListSlideDown(); + mSwipe.setSwipeEnable(isCheck); + isSlide = isCheck; + } + }); + } + + private void sliderColor(Slider slider) { + slider.addBarObserver(this); + ShapeElement shapeElement = new ShapeElement(); + shapeElement.setRgbColor(RgbColor.fromArgbInt(0XFFFF4081)); + shapeElement.setCornerRadius(100); + shapeElement.setBounds(0, 0, 36, 34); // 动态设置圆点宽高 + slider.setThumbElement(shapeElement); + } + + @Override + public void onBarChanged(int ii, int i1, int i2) { + mProgress.setText(i1 + ".0"); + mTextProgress = i1; + mSwipe.setNeedOffset(i1); + } +} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/MainActivity.java b/app/src/main/java/vienan/app/expandableswipelistview/MainActivity.java deleted file mode 100644 index 201083115a4c38369a322dbf553d4da7d0420081..0000000000000000000000000000000000000000 --- a/app/src/main/java/vienan/app/expandableswipelistview/MainActivity.java +++ /dev/null @@ -1,102 +0,0 @@ -package vienan.app.expandableswipelistview; - -import android.content.Intent; -import android.databinding.DataBindingUtil; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.Toast; - -import com.ditclear.swipelayout.SwipeDragLayout; -import com.google.android.libraries.remixer.Remixer; -import com.google.android.libraries.remixer.annotation.BooleanVariableMethod; -import com.google.android.libraries.remixer.annotation.RangeVariableMethod; -import com.google.android.libraries.remixer.annotation.RemixerBinder; -import com.google.android.libraries.remixer.storage.LocalStorage; -import com.google.android.libraries.remixer.ui.RemixerInitialization; -import com.google.android.libraries.remixer.ui.view.RemixerFragment; - -import vienan.app.expandableswipelistview.databinding.ActivityMainBinding; - -public class MainActivity extends AppCompatActivity implements View.OnClickListener { - - ActivityMainBinding mMainBinding; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mMainBinding= DataBindingUtil.setContentView(this,R.layout.activity_main); - mMainBinding.setPresenter(this); - RemixerFragment.newInstance().attachToFab(this,mMainBinding.fabBtn); - - //debug ui - RemixerInitialization.initRemixer(getApplication()); - Remixer.getInstance().setSynchronizationMechanism(new LocalStorage(getApplicationContext())); - RemixerBinder.bind(this); - - - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.list_btn: { - navigateTo(DemoListActivity.class); - break; - } - case R.id.recycler_btn: { - navigateTo(RecyclerActivity.class); - break; - } - case R.id.iv_type: { - Toast.makeText(this, "edit", Toast.LENGTH_SHORT).show(); - break; - } - case R.id.tv_title: { - Toast.makeText(this, "this is content", Toast.LENGTH_SHORT).show(); - break; - } - case R.id.trash: { - Toast.makeText(this, "delete", Toast.LENGTH_SHORT).show(); - break; - } - case R.id.star: { - Toast.makeText(this, "star", Toast.LENGTH_SHORT).show(); - break; - } - } - } - - - - - void navigateTo(Class c) { - - startActivity(new Intent(this, c)); - } - - @RangeVariableMethod(minValue = 1F, maxValue = 9F, initialValue = 2F) - public void 设置最小距离(Float offsetRatio) { - mMainBinding.swipLayout.setNeedOffset(offsetRatio/10); - } - - @BooleanVariableMethod(initialValue = true) - public void 开启IOS效果(Boolean ios) { - mMainBinding.swipLayout.setIos(ios); - } - - @BooleanVariableMethod(initialValue = true) - public void 切换滑动方向(Boolean left) { - mMainBinding.swipLayout.setSwipeDirection(left?SwipeDragLayout.DIRECTION_LEFT:SwipeDragLayout.DIRECTION_RIGHT); - mMainBinding.menuLayout.setLayoutDirection(left?LinearLayout.LAYOUT_DIRECTION_LTR:LinearLayout.LAYOUT_DIRECTION_RTL); - } - - @BooleanVariableMethod(initialValue = true) - public void 是否可滑动(Boolean enable) { - mMainBinding.swipLayout.setSwipeEnable(enable); - } - - -} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/MyApplication.java b/app/src/main/java/vienan/app/expandableswipelistview/MyApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..20a7d60ac4a850b8b3bf2a01cdf31562a773015d --- /dev/null +++ b/app/src/main/java/vienan/app/expandableswipelistview/MyApplication.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package vienan.app.expandableswipelistview; + +import ohos.aafwk.ability.AbilityPackage; + +public class MyApplication extends AbilityPackage { + @Override + public void onInitialize() { + super.onInitialize(); + } +} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/RecyItemProvider.java b/app/src/main/java/vienan/app/expandableswipelistview/RecyItemProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..c6c0f6fcd3a9140696eec42faedb6a5749dcd2ce --- /dev/null +++ b/app/src/main/java/vienan/app/expandableswipelistview/RecyItemProvider.java @@ -0,0 +1,103 @@ +package vienan.app.expandableswipelistview; + +import com.ditclear.swipelayout.SwipeDragLayout; +import ohos.agp.components.*; +import ohos.app.Context; + +import java.util.List; + +public class RecyItemProvider extends BaseItemProvider { + private List list; + private Context mContext; + private boolean isItemEnabled; + private SwipeDragLayout mSwipeLayout; + + /** + * 构造 + * + * @param list 数据 + * @param context 上下文 + */ + public RecyItemProvider(List list, Context context) { + this.list = list; + this.mContext = context; + } + + @Override + public int getCount() { + return list == null ? 0 : list.size(); + } + + @Override + public Object getItem(int position) { + if (list != null && position >= 0 && position < list.size()) { + return list.get(position); + } + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public Component getComponent(int position, Component convertComponent, ComponentContainer componentContainer) { + convertComponent = LayoutScatter.getInstance(mContext).parse(ResourceTable.Layout_list_item, null, false); + Text text = (Text) convertComponent.findComponentById(ResourceTable.Id_tv_title); + text.setText(list.get(position).getmData()); + SwipeDragLayout swipeDragLayout = (SwipeDragLayout) convertComponent.findComponentById(ResourceTable.Id_swipe); + convertComponent.findComponentById(ResourceTable.Id_iv_type).setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + ToastTool.showText(mContext,"edit"); + } + }); + convertComponent.findComponentById(ResourceTable.Id_tv_title).setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + if (!isItemEnabled) { + ToastTool.showText(mContext, list.get(position).getmData()); + } + isItemEnabled = false; + } + }); + convertComponent.findComponentById(ResourceTable.Id_dele).setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + ToastTool.showText(mContext, "delete " + list.get(position)); + list.remove(position); + mSwipeLayout.setListSlideDown(); + notifyDataChanged(); + } + }); + convertComponent.findComponentById(ResourceTable.Id_start).setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + ToastTool.showText(mContext,"star"); + } + }); + if (list.get(position).isSlide()) { + swipeDragLayout.setSwipeDirection("left"); + } else { + swipeDragLayout.setSwipeDirection("right"); + } + + swipeDragLayout.setSwipeListContainerListener(new SwipeDragLayout.SwipeListContainerListener() { + @Override + public void openSwipe(SwipeDragLayout swipeDragLayout) { + mSwipeLayout = swipeDragLayout; + isItemEnabled = true; + } + + @Override + public void clickSwipe(SwipeDragLayout swipeDragLayout) { + if (mSwipeLayout != null && mSwipeLayout != swipeDragLayout) { + mSwipeLayout.setListSlideDown(); + mSwipeLayout = null; + } + } + }); + return convertComponent; + } +} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/RecycleAbility.java b/app/src/main/java/vienan/app/expandableswipelistview/RecycleAbility.java new file mode 100644 index 0000000000000000000000000000000000000000..baf0d3a38d53345cd7a5ee21b6c91d1d5fc69eec --- /dev/null +++ b/app/src/main/java/vienan/app/expandableswipelistview/RecycleAbility.java @@ -0,0 +1,43 @@ +package vienan.app.expandableswipelistview; + +import ohos.aafwk.ability.Ability; +import ohos.aafwk.content.Intent; +import ohos.agp.components.ListContainer; +import ohos.agp.components.Text; +import ohos.agp.utils.Color; + +import java.util.ArrayList; +import java.util.List; + +public class RecycleAbility extends Ability { + private List mData = new ArrayList<>(); + private ListContainer mList; + private DataBean dataBean; + + @Override + public void onStart(Intent intent) { + getWindow().setStatusBarColor(Color.getIntColor("#303F9F")); + super.onStart(intent); + super.setUIContent(ResourceTable.Layout_ability_demo_list); + mList = (ListContainer) findComponentById(ResourceTable.Id_list); + Text mTitle = (Text) findComponentById(ResourceTable.Id_title); + mTitle.setText("RecycleView"); + initData(); + } + + private void initData() { + for (int i = 0; i <= 30; i++) { + if (i % 2 == 0) { + dataBean = new DataBean("item " + i, true); + } else { + dataBean = new DataBean("item " + i, false); + } + mData.add(dataBean); + } + RecyItemProvider dempItemProvider = new RecyItemProvider(mData, this); + mList.setItemProvider(dempItemProvider); + mList.setBoundarySwitch(true); + mList.setBoundaryColor(new Color(Color.getIntColor("#D6D7D7"))); + mList.setLongClickable(false); + } +} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/RecyclerActivity.java b/app/src/main/java/vienan/app/expandableswipelistview/RecyclerActivity.java deleted file mode 100644 index ad65d997b0e4a06bc65166ec29851974b48e8080..0000000000000000000000000000000000000000 --- a/app/src/main/java/vienan/app/expandableswipelistview/RecyclerActivity.java +++ /dev/null @@ -1,148 +0,0 @@ -package vienan.app.expandableswipelistview; - -import android.databinding.DataBindingUtil; -import android.databinding.ObservableArrayList; -import android.graphics.Color; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.Toast; - -import com.ditclear.swipelayout.SwipeDragLayout; - -import java.util.ArrayList; -import java.util.List; - -import vienan.app.expandableswipelistview.adapter.BindingViewAdapter; -import vienan.app.expandableswipelistview.adapter.BindingViewHolder; -import vienan.app.expandableswipelistview.adapter.SingleTypeAdapter; -import vienan.app.expandableswipelistview.databinding.ChildStatusItemBinding; -import vienan.app.expandableswipelistview.databinding.RecyclerActivityBinding; -import vienan.app.expandableswipelistview.model.LineItem; - -/** - * 页面描述:RecyclerActivity - * - * Created by ditclear on 2018/1/5. - */ - -public class RecyclerActivity extends AppCompatActivity - implements BindingViewAdapter.ItemDecorator, - BindingViewAdapter.ItemClickPresenter, SwipeRefreshLayout.OnRefreshListener { - - - RecyclerActivityBinding mBinding; - private SingleTypeAdapter adapter; - ObservableArrayList mDatas=new ObservableArrayList<>(); - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mBinding = DataBindingUtil.setContentView(this, R.layout.recycler_activity); - getSupportActionBar().setTitle("RecyclerView"); - mBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this)); - mBinding.recyclerView.addItemDecoration( - new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); - - adapter = new SingleTypeAdapter(this, - R.layout.child_status_item,mDatas); - - adapter.setItemDecorator(this); - adapter.setItemPresenter(this); - mBinding.recyclerView.setAdapter(adapter); - mDatas.addAll(fakeData()); - - mBinding.refreshLayout.setOnRefreshListener(this); - } - - /** - * @return 测试数据集 - */ - List fakeData() { - List items = new ArrayList<>(); - int d = 1; - for (int i = 0; i <= 30; i++) { - LineItem lineItem; - if (i % 2 == 0) { - lineItem = new LineItem("item"+i, true); - } else { - lineItem = new LineItem("item"+i, false); - } - items.add(lineItem); - } - return items; - } - - @Override - public void decorator(BindingViewHolder holder, final int position, int viewType) { - final ChildStatusItemBinding binding = (ChildStatusItemBinding) holder.getBinding(); - final LineItem lineItem=mDatas.get(position); - if (mDatas.get(position).isLeft()) { - binding.swipLayout.setSwipeDirection(SwipeDragLayout.DIRECTION_LEFT); - binding.menuLayout.setLayoutDirection(LinearLayout.LAYOUT_DIRECTION_LTR); - } else { - binding.swipLayout.setSwipeDirection(SwipeDragLayout.DIRECTION_RIGHT); - binding.menuLayout.setLayoutDirection(LinearLayout.LAYOUT_DIRECTION_RTL); - } - - binding.trash.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - toast("delete "+lineItem.getContent()); - mDatas.remove(lineItem); - } - }); - binding.swipLayout.setBackgroundColor(Color.parseColor("#FF6347")); - binding.swipLayout.addListener(new SwipeDragLayout.SwipeListener() { - @Override - public void onUpdate(SwipeDragLayout layout, float offsetRatio, float offset) { - //do sth. - } - - @Override - public void onOpened(SwipeDragLayout layout) { - //do sth.. - } - - @Override - public void onClosed(SwipeDragLayout layout) { - //do sth.. - } - }); - } - - void toast(String msg) { - Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); - } - - @Override - public void onItemClick(View v, LineItem item) { - switch (v.getId()){ - case R.id.iv_type: - toast("edit"); - break; - case R.id.tv_title: - toast(item.getContent()); - break; - case R.id.star: - toast("star"); - break; - - } - } - - @Override - public void onRefresh() { - mBinding.refreshLayout.postDelayed(new Runnable() { - @Override - public void run() { - mBinding.refreshLayout.setRefreshing(false); - } - },2000); - } -} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/ToastTool.java b/app/src/main/java/vienan/app/expandableswipelistview/ToastTool.java new file mode 100644 index 0000000000000000000000000000000000000000..1f8d47a03e11f206fe6e835bcde3bf082348e284 --- /dev/null +++ b/app/src/main/java/vienan/app/expandableswipelistview/ToastTool.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package vienan.app.expandableswipelistview; + +import ohos.agp.components.DirectionalLayout; +import ohos.agp.components.LayoutScatter; +import ohos.agp.components.Text; +import ohos.agp.utils.LayoutAlignment; +import ohos.agp.window.dialog.ToastDialog; +import ohos.app.Context; + +public class ToastTool { + private static ToastDialog toastDialog; + + /** + * toast方法 + * + * @param context 上下文 + * @param name 数据 + */ + public static void showText(Context context, String name) { + DirectionalLayout parse = (DirectionalLayout) LayoutScatter.getInstance(context).parse(ResourceTable.Layout_layout_toast, null, false); + Text componentById = (Text) parse.findComponentById(ResourceTable.Id_toast_text); + componentById.setText(name); + if (toastDialog == null) { + toastDialog = (ToastDialog) new ToastDialog(context).setContentCustomComponent(parse) + .setSize(DirectionalLayout.LayoutConfig.MATCH_CONTENT, DirectionalLayout.LayoutConfig.MATCH_CONTENT) + .setAlignment(LayoutAlignment.BOTTOM) + .setOffset(0, 90); + } else { + toastDialog.setContentCustomComponent(parse); + } + toastDialog.show(); + } + + /** + * 土司 + * + * @param context 上下文 + * @param name 数据 + */ + public static void showToast(Context context, String name) { + DirectionalLayout parse = (DirectionalLayout) LayoutScatter.getInstance(context).parse(ResourceTable.Layout_layout_toast, null, false); + Text componentById = (Text) parse.findComponentById(ResourceTable.Id_toast_text); + componentById.setText(name); + new ToastDialog(context).setContentCustomComponent(parse) + .setSize(DirectionalLayout.LayoutConfig.MATCH_CONTENT, DirectionalLayout.LayoutConfig.MATCH_CONTENT) + .setAlignment(LayoutAlignment.BOTTOM) + .setOffset(0, 90).show(); + } +} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/adapter/BindingViewAdapter.kt b/app/src/main/java/vienan/app/expandableswipelistview/adapter/BindingViewAdapter.kt deleted file mode 100644 index 48726202c8721b838d4176f149e85c6e47068ccd..0000000000000000000000000000000000000000 --- a/app/src/main/java/vienan/app/expandableswipelistview/adapter/BindingViewAdapter.kt +++ /dev/null @@ -1,45 +0,0 @@ -package vienan.app.expandableswipelistview.adapter - -import android.content.Context -import android.databinding.ObservableList -import android.databinding.ViewDataBinding -import android.support.v7.widget.RecyclerView -import android.view.LayoutInflater -import android.view.View -import vienan.app.expandableswipelistview.BR - -/** - * describe:BindingViewAdapter - * - * Created by ditclear on 2017/10/30. - */ -abstract class BindingViewAdapter(context: Context, protected val list: ObservableList) : RecyclerView.Adapter>() { - - protected val mLayoutInflater: LayoutInflater = LayoutInflater.from(context) - - var itemPresenter: ItemClickPresenter? = null - - var itemDecorator: ItemDecorator? = null - - - override fun onBindViewHolder(holder: BindingViewHolder, position: Int) { - val item = list[position] - holder.binding.setVariable(BR.item, item) - holder.binding.setVariable(BR.presenter, itemPresenter) - holder.binding.executePendingBindings() - itemDecorator?.decorator(holder, position, getItemViewType(position)) - } - - override fun getItemCount(): Int = list.size - - fun getItem(position: Int): T? = list[position] - - interface ItemClickPresenter { - fun onItemClick(v: View? = null, item: Any) - - } - - interface ItemDecorator { - fun decorator(holder: BindingViewHolder?, position: Int, viewType: Int) - } -} \ No newline at end of file diff --git a/app/src/main/java/vienan/app/expandableswipelistview/adapter/BindingViewHolder.kt b/app/src/main/java/vienan/app/expandableswipelistview/adapter/BindingViewHolder.kt deleted file mode 100644 index 268c3b5b30279415266a7717c34f9ea8cf26a81c..0000000000000000000000000000000000000000 --- a/app/src/main/java/vienan/app/expandableswipelistview/adapter/BindingViewHolder.kt +++ /dev/null @@ -1,6 +0,0 @@ -package vienan.app.expandableswipelistview.adapter - -import android.databinding.ViewDataBinding -import android.support.v7.widget.RecyclerView - -class BindingViewHolder(val binding: T) : RecyclerView.ViewHolder(binding.root) \ No newline at end of file diff --git a/app/src/main/java/vienan/app/expandableswipelistview/adapter/MultiTypeAdapter.kt b/app/src/main/java/vienan/app/expandableswipelistview/adapter/MultiTypeAdapter.kt deleted file mode 100644 index 44b3fdddcefa69e95cce5c9da64d394610028d7c..0000000000000000000000000000000000000000 --- a/app/src/main/java/vienan/app/expandableswipelistview/adapter/MultiTypeAdapter.kt +++ /dev/null @@ -1,77 +0,0 @@ -package vienan.app.expandableswipelistview.adapter - -import android.content.Context -import android.content.res.Resources -import android.databinding.DataBindingUtil -import android.databinding.ObservableArrayList -import android.databinding.ObservableList -import android.databinding.ViewDataBinding -import android.support.annotation.LayoutRes -import android.support.v4.util.ArrayMap -import android.view.ViewGroup - -/** - * 页面描述:MultiTypeAdapter - * - * Created by ditclear on 2017/10/30. - */ -class MultiTypeAdapter(context: Context, list: ObservableArrayList, val multiViewTyper: MultiViewTyper) : BindingViewAdapter(context, list) { - - protected var mCollectionViewType: MutableList = mutableListOf() - - private val mItemTypeToLayoutMap = ArrayMap() - - init { - list.addOnListChangedCallback(object : ObservableList.OnListChangedCallback>() { - override fun onItemRangeMoved(sender: ObservableList?, fromPosition: Int, toPosition: Int, itemCount: Int) { - notifyItemMoved(fromPosition, toPosition) - } - - override fun onItemRangeRemoved(sender: ObservableList?, positionStart: Int, itemCount: Int) { - for (i in positionStart + itemCount - 1 downTo positionStart) mCollectionViewType.removeAt(i) - if (sender?.isNotEmpty() == true) { - notifyItemRangeRemoved(positionStart, itemCount) - } else { - notifyDataSetChanged() - } - } - - override fun onItemRangeChanged(sender: ObservableList?, positionStart: Int, itemCount: Int) { - notifyItemRangeChanged(positionStart, itemCount) - } - - override fun onItemRangeInserted(sender: ObservableList?, positionStart: Int, itemCount: Int) { - sender?.run { - (positionStart until positionStart + itemCount).forEach { - mCollectionViewType.add(it, multiViewTyper.getViewType(this[it])) - } - notifyItemRangeInserted(positionStart, itemCount) - } - } - - override fun onChanged(sender: ObservableList?) { - notifyDataSetChanged() - } - - }) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingViewHolder { - return BindingViewHolder( - DataBindingUtil.inflate(mLayoutInflater, getLayoutRes(viewType), parent, false)) - } - - fun addViewTypeToLayoutMap(viewType: Int?, layoutRes: Int?) { - mItemTypeToLayoutMap.put(viewType, layoutRes) - } - - override fun getItemViewType(position: Int): Int = mCollectionViewType[position] - - interface MultiViewTyper { - fun getViewType(item: Any): Int - } - - @LayoutRes - protected fun getLayoutRes(viewType: Int): Int = mItemTypeToLayoutMap[viewType] - ?: throw Resources.NotFoundException("$viewType 对应的布局不存在") -} \ No newline at end of file diff --git a/app/src/main/java/vienan/app/expandableswipelistview/adapter/SingleTypeAdapter.kt b/app/src/main/java/vienan/app/expandableswipelistview/adapter/SingleTypeAdapter.kt deleted file mode 100644 index 960c0f7ef2644cccce9a1f65b22a8b512ba10765..0000000000000000000000000000000000000000 --- a/app/src/main/java/vienan/app/expandableswipelistview/adapter/SingleTypeAdapter.kt +++ /dev/null @@ -1,51 +0,0 @@ -package vienan.app.expandableswipelistview.adapter - -import android.content.Context -import android.databinding.DataBindingUtil -import android.databinding.ObservableArrayList -import android.databinding.ObservableList -import android.databinding.ViewDataBinding -import android.view.ViewGroup - - -/** - * 页面描述:SingleTypeAdapter - * - * Created by ditclear on 2017/10/3. - */ -open class SingleTypeAdapter(context: Context, private val layoutRes: Int, list: ObservableArrayList) : BindingViewAdapter(context, list) { - - init { - initSingleList() - } - - protected fun initSingleList(){ - list.addOnListChangedCallback(object : ObservableList.OnListChangedCallback>() { - override fun onChanged(contributorViewModels: ObservableList) { - notifyDataSetChanged() - } - - override fun onItemRangeChanged(contributorViewModels: ObservableList, i: Int, i1: Int) { - notifyItemRangeChanged(i, i1) - } - - override fun onItemRangeInserted(contributorViewModels: ObservableList, i: Int, i1: Int) { - notifyItemRangeInserted(i, i1) - } - - override fun onItemRangeMoved(contributorViewModels: ObservableList, i: Int, i1: Int, i2: Int) { - notifyItemMoved(i, i1) - } - - override fun onItemRangeRemoved(contributorViewModels: ObservableList, i: Int, i1: Int) { - notifyItemRangeRemoved(i,i1) - } - }) - } - - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = - BindingViewHolder(DataBindingUtil.inflate(mLayoutInflater, layoutRes, parent, false)) - - -} \ No newline at end of file diff --git a/app/src/main/java/vienan/app/expandableswipelistview/model/Dummy.java b/app/src/main/java/vienan/app/expandableswipelistview/model/Dummy.java deleted file mode 100644 index 7df3526085533f26753fb7b44a4949add7896f37..0000000000000000000000000000000000000000 --- a/app/src/main/java/vienan/app/expandableswipelistview/model/Dummy.java +++ /dev/null @@ -1,4 +0,0 @@ -package vienan.app.expandableswipelistview.model; - -public class Dummy { -} diff --git a/app/src/main/java/vienan/app/expandableswipelistview/model/LineItem.java b/app/src/main/java/vienan/app/expandableswipelistview/model/LineItem.java deleted file mode 100644 index 18e6257e11f5cad201048098736126e527d4b0cf..0000000000000000000000000000000000000000 --- a/app/src/main/java/vienan/app/expandableswipelistview/model/LineItem.java +++ /dev/null @@ -1,44 +0,0 @@ -package vienan.app.expandableswipelistview.model; - -/** - * 页面描述: - *

- * Created by ditclear on 2016/12/17. - */ - -public class LineItem { - - private String content; - private boolean isLeft; - - private boolean isOpened=false; - - public boolean isOpened() { - return isOpened; - } - - public void setOpened(boolean opened) { - isOpened = opened; - } - - public LineItem(String content, boolean isLeft) { - this.content = content; - this.isLeft = isLeft; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public boolean isLeft() { - return isLeft; - } - - public void setLeft(boolean left) { - isLeft = left; - } -} diff --git a/app/src/main/res/drawable/bg_item.xml b/app/src/main/res/drawable/bg_item.xml deleted file mode 100644 index 7e6665996583c7924c31968a5bfcaafac7490da0..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable/bg_item.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_item_trash.xml b/app/src/main/res/drawable/bg_item_trash.xml deleted file mode 100644 index 2bc5c72c7cd9743ad58f900af841d26a50ce9fcd..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable/bg_item_trash.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/type_edit.xml b/app/src/main/res/drawable/type_edit.xml deleted file mode 100644 index 7e576888e2b790ce8af21f561521db224a5f0bc6..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable/type_edit.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index fa9a219dfa54a751fc4cb1789d3df7d2423a2c7c..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - -