diff --git a/build.gradle b/build.gradle index 2de8191..e1a253c 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,7 @@ buildscript { allprojects { repositories { jcenter() + maven { url "https://jitpack.io" } } } diff --git a/demo/build.gradle b/demo/build.gradle index fa5ec29..1dd6922 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 25 - buildToolsVersion "25.0.2" + buildToolsVersion "25.0.3" defaultConfig { applicationId "com.aitsuki.swipedemo" minSdkVersion 15 @@ -35,6 +35,10 @@ dependencies { androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - testCompile 'junit:junit:4.12' + compile project(':library') + compile 'com.android.support.constraint:constraint-layout:1.0.2' + testCompile 'junit:junit:4.12' + compile 'com.android.support:appcompat-v7:25.3.1' + compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.24' } diff --git a/demo/src/main/AndroidManifest.xml b/demo/src/main/AndroidManifest.xml index b873bd2..f2235f6 100644 --- a/demo/src/main/AndroidManifest.xml +++ b/demo/src/main/AndroidManifest.xml @@ -8,13 +8,15 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> - + + + \ No newline at end of file diff --git a/demo/src/main/java/com/aitsuki/swipedemo/CymChadActivity.java b/demo/src/main/java/com/aitsuki/swipedemo/CymChadActivity.java new file mode 100644 index 0000000..4950399 --- /dev/null +++ b/demo/src/main/java/com/aitsuki/swipedemo/CymChadActivity.java @@ -0,0 +1,113 @@ +package com.aitsuki.swipedemo; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.DividerItemDecoration; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import com.aitsuki.swipe.SwipeItemLayout; +import com.aitsuki.swipedemo.data.Repository; +import com.aitsuki.swipedemo.entity.Data; +import com.aitsuki.swipedemo.entity.Type; +import com.aitsuki.swipedemo.util.ToastUtil; +import com.chad.library.adapter.base.BaseMultiItemQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; + +import java.util.List; + +/** + * Created by AItsuki on 2017/7/11. + * 使用CymChad的adapter库 + * + * BaseRecyclerViewAdapterHelper + * + */ +public class CymChadActivity extends AppCompatActivity { + + public static Intent getCallingIntent(Context context) { + return new Intent(context, CymChadActivity.class); + } + + ItemTouchListener mItemTouchListener = new ItemTouchListener() { + @Override + public void onItemClick(String str) { + ToastUtil.show(str); + } + + @Override + public void onLeftMenuClick(String str) { + ToastUtil.show(str); + } + + @Override + public void onRightMenuClick(String str) { + ToastUtil.show(str); + } + }; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_swipe_menu_recyclerview); + + RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); + recyclerView.setLayoutManager(linearLayoutManager); + DividerItemDecoration dividerItemDecoration = + new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); + recyclerView.addItemDecoration(dividerItemDecoration); + + DemoAdapter demoAdapter = new DemoAdapter(new Repository().fakeDate(), mItemTouchListener); + recyclerView.setAdapter(demoAdapter); + } + + private class DemoAdapter extends BaseMultiItemQuickAdapter { + + private ItemTouchListener mItemTouchListener; + + DemoAdapter(List data, ItemTouchListener touchListener) { + super(data); + mItemTouchListener = touchListener; + addItemType(Type.LEFT_MENU, R.layout.item_left_menu); + addItemType(Type.RIGHT_MENU, R.layout.item_right_menu); + addItemType(Type.LEFT_AND_RIGHT_MENU, R.layout.item_left_and_right_menu); + addItemType(Type.LEFT_LONG_MENU, R.layout.item_left_long_menu); + addItemType(Type.RIGHT_LONG_MENU, R.layout.item_right_long_menu); + addItemType(Type.LEFT_AND_RIGHT_LONG_MENU, R.layout.item_left_and_right_long_menu); + addItemType(Type.DISABLE_SWIPE_MENU, R.layout.item_disable_swipe_menu); + } + + @Override + protected void convert(BaseViewHolder helper, Data data) { + + helper.setText(R.id.tv_content, data.content + " " + helper.getAdapterPosition()); + final SwipeItemLayout swipeLayout = (SwipeItemLayout) helper.itemView; + swipeLayout.setSwipeEnable(helper.getItemViewType() != Type.DISABLE_SWIPE_MENU); + + // 不使用helper设置点击事件是因为child点击的时候无法获取到ItemView……,无法关闭菜单 + // 希望BaseRecyclerViewAdapterHelper这个库的作者以后会加上…… + + helper.itemView.setOnClickListener(v -> mItemTouchListener.onItemClick(data.content)); + final View leftMenu = helper.getView(R.id.left_menu); + if (leftMenu != null) { + leftMenu.setOnClickListener(v -> { + mItemTouchListener.onLeftMenuClick("left " + helper.getAdapterPosition()); + swipeLayout.close(); + }); + } + + final View rightMenu = helper.getView(R.id.right_menu); + if (rightMenu != null) { + rightMenu.setOnClickListener(v -> { + mItemTouchListener.onLeftMenuClick("right " + helper.getAdapterPosition()); + swipeLayout.close(); + }); + } + } + } +} diff --git a/demo/src/main/java/com/aitsuki/swipedemo/ItemTouchListener.java b/demo/src/main/java/com/aitsuki/swipedemo/ItemTouchListener.java new file mode 100644 index 0000000..2a42bb5 --- /dev/null +++ b/demo/src/main/java/com/aitsuki/swipedemo/ItemTouchListener.java @@ -0,0 +1,13 @@ +package com.aitsuki.swipedemo; + +/** + * Created by AItsuki on 2017/7/11. + * ItemTouchListener + */ +interface ItemTouchListener { + void onItemClick(String str); + + void onLeftMenuClick(String str); + + void onRightMenuClick(String str); +} diff --git a/demo/src/main/java/com/aitsuki/swipedemo/MainActivity.java b/demo/src/main/java/com/aitsuki/swipedemo/MainActivity.java index cabbc86..a5719c1 100644 --- a/demo/src/main/java/com/aitsuki/swipedemo/MainActivity.java +++ b/demo/src/main/java/com/aitsuki/swipedemo/MainActivity.java @@ -1,24 +1,12 @@ package com.aitsuki.swipedemo; +import android.content.Intent; import android.os.Bundle; -import android.support.annotation.LayoutRes; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import com.aitsuki.swipe.SwipeItemLayout; -import com.aitsuki.swipedemo.data.Repository; -import com.aitsuki.swipedemo.entity.Data; -import com.aitsuki.swipedemo.entity.Type; import com.aitsuki.swipedemo.util.ToastUtil; -import java.util.List; - public class MainActivity extends AppCompatActivity { @Override @@ -26,134 +14,15 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ToastUtil.init(getApplication()); - - RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); - LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); - recyclerView.setLayoutManager(linearLayoutManager); - DividerItemDecoration dividerItemDecoration = - new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); - recyclerView.addItemDecoration(dividerItemDecoration); - - DemoAdapter adapter = new DemoAdapter(new Repository().fakeDate(), mItemTouchListener); - recyclerView.setAdapter(adapter); - } - - ItemTouchListener mItemTouchListener = new ItemTouchListener() { - @Override - public void onItemClick(String str) { - ToastUtil.show(str); - } - - @Override - public void onLeftMenuClick(String str) { - ToastUtil.show(str); - } - - @Override - public void onRightMenuClick(String str) { - ToastUtil.show(str); - } - }; - - interface ItemTouchListener { - void onItemClick(String str); - - void onLeftMenuClick(String str); - - void onRightMenuClick(String str); } - private static class DemoAdapter extends RecyclerView.Adapter { - - private ItemTouchListener mItemTouchListener; - private List mData; - - DemoAdapter(List data, ItemTouchListener itemTouchListener) { - this.mData = data; - this.mItemTouchListener = itemTouchListener; - } - - @Override - public int getItemViewType(int position) { - return mData.get(position).type; - } - - - @Override - public int getItemCount() { - return mData.size(); - } - - @Override - public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - - @LayoutRes - int layout; - - switch (viewType) { - case Type.LEFT_MENU: - layout = R.layout.item_left_menu; - break; - case Type.RIGHT_MENU: - layout = R.layout.item_right_menu; - break; - case Type.LEFT_AND_RIGHT_MENU: - layout = R.layout.item_left_and_right_menu; - break; - case Type.LEFT_LONG_MENU: - layout = R.layout.item_left_long_menu; - break; - case Type.RIGHT_LONG_MENU: - layout = R.layout.item_right_long_menu; - break; - case Type.LEFT_AND_RIGHT_LONG_MENU: - layout = R.layout.item_left_and_right_long_menu; - break; - default: - layout = R.layout.item_left_menu; - break; - } - View rootView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false); - return new SimpleViewHolder(rootView); - } - - @Override - public void onBindViewHolder(final SimpleViewHolder holder, int position) { - holder.mContent.setText(mData.get(position).content.concat(" " + position)); - if (mItemTouchListener != null) { - holder.itemView.setOnClickListener(v -> mItemTouchListener.onItemClick(holder.mContent.getText().toString())); - - if (holder.mLeftMenu != null) { - holder.mLeftMenu.setOnClickListener(v -> { - mItemTouchListener.onLeftMenuClick("left " + holder.getAdapterPosition()); - holder.mSwipeItemLayout.close(); - }); - } - - if (holder.mRightMenu != null) { - holder.mRightMenu.setOnClickListener(v -> { - mItemTouchListener.onRightMenuClick("right " + holder.getAdapterPosition()); - holder.mSwipeItemLayout.close(); - }); - } - } - } - + public void onNativeAdapterClick(View view) { + Intent callingIntent = NativeRecyclerViewAdapterActivity.getCallingIntent(this); + startActivity(callingIntent); } - private static class SimpleViewHolder extends RecyclerView.ViewHolder { - - private final View mLeftMenu; - private final View mRightMenu; - private final TextView mContent; - private final SwipeItemLayout mSwipeItemLayout; - - SimpleViewHolder(View itemView) { - super(itemView); - mSwipeItemLayout = (SwipeItemLayout) itemView.findViewById(R.id.swipe_layout); - mContent = (TextView) itemView.findViewById(R.id.tv_content); - mLeftMenu = itemView.findViewById(R.id.left_menu); - mRightMenu = itemView.findViewById(R.id.right_menu); - } + public void onBaseRecyclerViewAdapterHelperClick(View view) { + Intent callingIntent = CymChadActivity.getCallingIntent(this); + startActivity(callingIntent); } } diff --git a/demo/src/main/java/com/aitsuki/swipedemo/NativeRecyclerViewAdapterActivity.java b/demo/src/main/java/com/aitsuki/swipedemo/NativeRecyclerViewAdapterActivity.java new file mode 100644 index 0000000..0201967 --- /dev/null +++ b/demo/src/main/java/com/aitsuki/swipedemo/NativeRecyclerViewAdapterActivity.java @@ -0,0 +1,159 @@ +package com.aitsuki.swipedemo; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.LayoutRes; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.DividerItemDecoration; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.aitsuki.swipe.SwipeItemLayout; +import com.aitsuki.swipedemo.data.Repository; +import com.aitsuki.swipedemo.entity.Data; +import com.aitsuki.swipedemo.entity.Type; +import com.aitsuki.swipedemo.util.ToastUtil; + +import java.util.List; + +public class NativeRecyclerViewAdapterActivity extends AppCompatActivity { + + public static Intent getCallingIntent(Context context) { + return new Intent(context, NativeRecyclerViewAdapterActivity.class); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_swipe_menu_recyclerview); + + RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); + recyclerView.setLayoutManager(linearLayoutManager); + DividerItemDecoration dividerItemDecoration = + new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); + recyclerView.addItemDecoration(dividerItemDecoration); + + DemoAdapter adapter = new DemoAdapter(new Repository().fakeDate(), mItemTouchListener); + recyclerView.setAdapter(adapter); + } + + ItemTouchListener mItemTouchListener = new ItemTouchListener() { + @Override + public void onItemClick(String str) { + ToastUtil.show(str); + } + + @Override + public void onLeftMenuClick(String str) { + ToastUtil.show(str); + } + + @Override + public void onRightMenuClick(String str) { + ToastUtil.show(str); + } + }; + + private static class DemoAdapter extends RecyclerView.Adapter { + + private ItemTouchListener mItemTouchListener; + private List mData; + + DemoAdapter(List data, ItemTouchListener itemTouchListener) { + this.mData = data; + this.mItemTouchListener = itemTouchListener; + } + + @Override + public int getItemViewType(int position) { + return mData.get(position).type; + } + + @Override + public int getItemCount() { + return mData.size(); + } + + @Override + public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + + @LayoutRes + int layout; + + switch (viewType) { + case Type.LEFT_MENU: + layout = R.layout.item_left_menu; + break; + case Type.RIGHT_MENU: + layout = R.layout.item_right_menu; + break; + case Type.LEFT_AND_RIGHT_MENU: + layout = R.layout.item_left_and_right_menu; + break; + case Type.LEFT_LONG_MENU: + layout = R.layout.item_left_long_menu; + break; + case Type.RIGHT_LONG_MENU: + layout = R.layout.item_right_long_menu; + break; + case Type.LEFT_AND_RIGHT_LONG_MENU: + layout = R.layout.item_left_and_right_long_menu; + break; + case Type.DISABLE_SWIPE_MENU: + layout = R.layout.item_disable_swipe_menu; + break; + default: + layout = R.layout.item_left_menu; + break; + } + View rootView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false); + return new SimpleViewHolder(rootView); + } + + @Override + public void onBindViewHolder(final SimpleViewHolder holder, int position) { + holder.mContent.setText(mData.get(position).content.concat(" " + position)); + holder.mSwipeItemLayout.setSwipeEnable(getItemViewType(position) != Type.DISABLE_SWIPE_MENU); + if (mItemTouchListener != null) { + holder.itemView.setOnClickListener(v -> mItemTouchListener.onItemClick(holder.mContent.getText().toString())); + + if (holder.mLeftMenu != null) { + holder.mLeftMenu.setOnClickListener(v -> { + mItemTouchListener.onLeftMenuClick("left " + holder.getAdapterPosition()); + holder.mSwipeItemLayout.close(); + }); + } + + if (holder.mRightMenu != null) { + holder.mRightMenu.setOnClickListener(v -> { + mItemTouchListener.onRightMenuClick("right " + holder.getAdapterPosition()); + holder.mSwipeItemLayout.close(); + }); + } + } + } + + } + + private static class SimpleViewHolder extends RecyclerView.ViewHolder { + + private final View mLeftMenu; + private final View mRightMenu; + private final TextView mContent; + private final SwipeItemLayout mSwipeItemLayout; + + SimpleViewHolder(View itemView) { + super(itemView); + mSwipeItemLayout = (SwipeItemLayout) itemView.findViewById(R.id.swipe_layout); + mContent = (TextView) itemView.findViewById(R.id.tv_content); + mLeftMenu = itemView.findViewById(R.id.left_menu); + mRightMenu = itemView.findViewById(R.id.right_menu); + } + } +} diff --git a/demo/src/main/java/com/aitsuki/swipedemo/data/Repository.java b/demo/src/main/java/com/aitsuki/swipedemo/data/Repository.java index f930f9b..e9ee15e 100644 --- a/demo/src/main/java/com/aitsuki/swipedemo/data/Repository.java +++ b/demo/src/main/java/com/aitsuki/swipedemo/data/Repository.java @@ -8,15 +8,15 @@ /** * Created by AItsuki on 2017/3/23. + * */ - public class Repository { public List fakeDate() { List dataList = new ArrayList<>(); for (int i = 0; i < 50; i++) { Data data = new Data(); - data.type = i % 6; + data.type = i % 7; switch (data.type) { case Type.LEFT_MENU: data.content = "LEFT_MENU"; @@ -36,6 +36,9 @@ public List fakeDate() { case Type.LEFT_AND_RIGHT_LONG_MENU: data.content = "LEFT_AND_RIGHT_LONG_MENU"; break; + case Type.DISABLE_SWIPE_MENU: + data.content = "DISABLE_SWIPE_MENU"; + break; default: data.content = "DEFAULT"; break; diff --git a/demo/src/main/java/com/aitsuki/swipedemo/entity/Data.java b/demo/src/main/java/com/aitsuki/swipedemo/entity/Data.java index cd6b989..0bd6218 100644 --- a/demo/src/main/java/com/aitsuki/swipedemo/entity/Data.java +++ b/demo/src/main/java/com/aitsuki/swipedemo/entity/Data.java @@ -1,9 +1,17 @@ package com.aitsuki.swipedemo.entity; +import com.chad.library.adapter.base.entity.MultiItemEntity; + /** * Created by AItsuki on 2017/3/23. + * Data */ -public class Data { +public class Data implements MultiItemEntity { public int type; public String content; + + @Override + public int getItemType() { + return type; + } } diff --git a/demo/src/main/java/com/aitsuki/swipedemo/entity/Type.java b/demo/src/main/java/com/aitsuki/swipedemo/entity/Type.java index f99fad4..bcd80ff 100644 --- a/demo/src/main/java/com/aitsuki/swipedemo/entity/Type.java +++ b/demo/src/main/java/com/aitsuki/swipedemo/entity/Type.java @@ -2,8 +2,8 @@ /** * Created by AItsuki on 2017/3/23. + * */ - public interface Type { int LEFT_MENU = 0; int RIGHT_MENU = 1; @@ -11,4 +11,5 @@ public interface Type { int LEFT_LONG_MENU = 3; int RIGHT_LONG_MENU = 4; int LEFT_AND_RIGHT_LONG_MENU = 5; + int DISABLE_SWIPE_MENU = 6; } diff --git a/demo/src/main/res/layout/activity_main.xml b/demo/src/main/res/layout/activity_main.xml index 072ff2a..162dcb2 100644 --- a/demo/src/main/res/layout/activity_main.xml +++ b/demo/src/main/res/layout/activity_main.xml @@ -1,18 +1,36 @@ - - +