Skip to content

Commit 16031ed

Browse files
XiandengWangXiandengWang
authored andcommitted
fix: 修复一些bug
1 parent 7fcaafa commit 16031ed

File tree

7 files changed

+120
-49
lines changed

7 files changed

+120
-49
lines changed

README.md

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,37 @@
1717
compile 'com.github.HalfStackDeveloper:SwipeCardRecyclerView:v1.0.0'
1818
}
1919

20+
### 使用 (参见demo)
21+
**1.RecyclerView设置**
22+
23+
mRecyclerView = (SwipeCardRecyclerView) findViewById(R.id.recyclerView);
24+
mRecyclerView.setLayoutManager(new SwipeCardLayoutManager());
25+
26+
mAdapter = new MyAdapter(this, list);
27+
mRecyclerView.setAdapter(mAdapter);
28+
29+
**2.创建继承自SwipeCardAdapter的adapter**
30+
31+
class MyAdapter extends SwipeCardAdapter
32+
2033
### 具体细节可移步[《如何利用RecyclerView打造炫酷滑动卡片》](http://www.jianshu.com/p/7977006d2d6a),欢迎大家fork AND star!
2134

2235
### 动画效果
36+
![](http://od35ecbnl.bkt.clouddn.com/swipecard.gif)
37+
38+
### 开源协议
39+
40+
Copyright (C)2016, 汪先登
41+
42+
Licensed under the Apache License, Version 2.0 (the "License");
43+
you may not use this file except in compliance with the License.
44+
You may obtain a copy of the License at
45+
46+
http://www.apache.org/licenses/LICENSE-2.0
47+
48+
Unless required by applicable law or agreed to in writing, software
49+
distributed under the License is distributed on an "AS IS" BASIS,
50+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
51+
See the License for the specific language governing permissions and
52+
limitations under the License.
2353

24-
![](http://od35ecbnl.bkt.clouddn.com/swipecard.gif)

demo/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,5 @@ dependencies {
2626
})
2727
compile 'com.android.support:appcompat-v7:24.2.0'
2828
testCompile 'junit:junit:4.12'
29-
compile 'com.github.HalfStackDeveloper:SwipeCardRecyclerView:v1.0.0'
29+
compile project(path: ':swipecardrecyclerview')
3030
}

demo/src/main/java/com/wangxiandeng/demo/MainActivity.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import android.widget.Toast;
66

77
import com.wangxiandeng.swipecardrecyclerview.ItemRemovedListener;
8-
import com.wangxiandeng.swipecardrecyclerview.SwipeCardAdapter;
98
import com.wangxiandeng.swipecardrecyclerview.SwipeCardLayoutManager;
109
import com.wangxiandeng.swipecardrecyclerview.SwipeCardRecyclerView;
1110

@@ -14,7 +13,7 @@
1413

1514
public class MainActivity extends AppCompatActivity {
1615
private SwipeCardRecyclerView mRecyclerView;
17-
private SwipeCardAdapter mAdapter;
16+
private MyAdapter mAdapter;
1817

1918
@Override
2019
protected void onCreate(Bundle savedInstanceState) {
@@ -26,7 +25,7 @@ protected void onCreate(Bundle savedInstanceState) {
2625
for (int i = 0; i < 10; i++) {
2726
list.add(String.valueOf(i));
2827
}
29-
mAdapter = new SwipeCardAdapter(this, list);
28+
mAdapter = new MyAdapter(this, list);
3029
mRecyclerView.setAdapter(mAdapter);
3130
mRecyclerView.setRemovedListener(new ItemRemovedListener() {
3231
@Override
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.wangxiandeng.demo;
2+
3+
import android.content.Context;
4+
import android.support.v7.widget.RecyclerView;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.widget.TextView;
9+
10+
import com.wangxiandeng.swipecardrecyclerview.SwipeCardAdapter;
11+
12+
import java.util.List;
13+
14+
/**
15+
* Created by xingzhu on 2016/11/15.
16+
*/
17+
18+
public class MyAdapter extends SwipeCardAdapter<MyAdapter.MyHolder> {
19+
private Context mContext;
20+
21+
public MyAdapter(Context context, List<String> list) {
22+
super(list);
23+
mContext = context;
24+
}
25+
26+
27+
@Override
28+
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
29+
View view = LayoutInflater.from(mContext).inflate(com.wangxiandeng.swipecardrecyclerview.R.layout.layout_item, parent, false);
30+
return new MyHolder(view);
31+
}
32+
33+
@Override
34+
public void onBindViewHolder(MyHolder holder, int position) {
35+
holder.setData((String) mList.get(position));
36+
}
37+
38+
class MyHolder extends RecyclerView.ViewHolder {
39+
private TextView mTextView;
40+
41+
public MyHolder(View itemView) {
42+
super(itemView);
43+
mTextView = (TextView) itemView.findViewById(com.wangxiandeng.swipecardrecyclerview.R.id.text);
44+
}
45+
46+
public void setData(String text) {
47+
mTextView.setText(text);
48+
}
49+
}
50+
}

swipecardrecyclerview/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ android {
55
buildToolsVersion "24.0.2"
66

77
defaultConfig {
8-
minSdkVersion 15
8+
minSdkVersion 19
99
targetSdkVersion 24
1010
versionCode 1
1111
versionName "1.0"
Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,26 @@
11
package com.wangxiandeng.swipecardrecyclerview;
22

3-
import android.content.Context;
43
import android.support.v7.widget.RecyclerView;
5-
import android.view.LayoutInflater;
6-
import android.view.View;
7-
import android.view.ViewGroup;
8-
import android.widget.TextView;
94

105
import java.util.List;
116

127
/**
138
* Created by WangXiandeng on 2016/11/3.
149
*/
1510

16-
public class SwipeCardAdapter extends RecyclerView.Adapter<SwipeCardAdapter.SwipeCardHolder> {
17-
private Context mContext;
18-
private List<String> mList;
11+
public abstract class SwipeCardAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
12+
protected List mList;
1913

20-
public SwipeCardAdapter(Context context, List<String> list) {
21-
mContext = context;
14+
public SwipeCardAdapter(List list) {
2215
mList = list;
2316
}
2417

25-
26-
@Override
27-
public SwipeCardHolder onCreateViewHolder(ViewGroup parent, int viewType) {
28-
View view = LayoutInflater.from(mContext).inflate(R.layout.layout_item, parent, false);
29-
return new SwipeCardHolder(view);
30-
}
31-
32-
@Override
33-
public void onBindViewHolder(SwipeCardHolder holder, int position) {
34-
holder.setData(mList.get(position));
35-
}
36-
3718
/**
3819
* 删除最顶部Item
3920
*/
4021

41-
public void delTopItem(){
42-
int position=getItemCount()-1;
22+
public void delTopItem() {
23+
int position = getItemCount() - 1;
4324
mList.remove(position);
4425
notifyItemRemoved(position);
4526
}
@@ -48,17 +29,4 @@ public void delTopItem(){
4829
public int getItemCount() {
4930
return mList.size();
5031
}
51-
52-
class SwipeCardHolder extends RecyclerView.ViewHolder {
53-
private TextView mTextView;
54-
55-
public SwipeCardHolder(View itemView) {
56-
super(itemView);
57-
mTextView = (TextView) itemView.findViewById(R.id.text);
58-
}
59-
60-
public void setData(String text) {
61-
mTextView.setText(text);
62-
}
63-
}
6432
}

swipecardrecyclerview/src/main/java/com/wangxiandeng/swipecardrecyclerview/SwipeCardRecyclerView.java

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,16 @@
1212
import android.util.TypedValue;
1313
import android.view.MotionEvent;
1414
import android.view.View;
15+
import android.view.ViewPropertyAnimator;
16+
import android.view.animation.Animation;
1517
import android.view.animation.LinearInterpolator;
1618
import android.view.animation.OvershootInterpolator;
1719
import android.widget.FrameLayout;
1820
import android.widget.ImageView;
1921

22+
import java.util.HashMap;
23+
import java.util.Map;
24+
2025
/**
2126
* Created by WangXiandeng on 2016/11/3.
2227
*/
@@ -25,6 +30,9 @@ public class SwipeCardRecyclerView extends RecyclerView {
2530
private float mTopViewX;
2631
private float mTopViewY;
2732

33+
private float mTopViewOffsetX = 0;
34+
private float mTopViewOffsetY = 0;
35+
2836
private float mTouchDownX;
2937
private float mTouchDownY;
3038

@@ -36,6 +44,9 @@ public class SwipeCardRecyclerView extends RecyclerView {
3644
private int[] mDecorViewLocation = new int[2];
3745

3846

47+
private Map<View, Animator> mAnimatorMap;
48+
49+
3950
public SwipeCardRecyclerView(Context context) {
4051
super(context);
4152
initView();
@@ -54,6 +65,7 @@ public SwipeCardRecyclerView(Context context, @Nullable AttributeSet attrs, int
5465
private void initView() {
5566
mDecorView = (FrameLayout) ((Activity) getContext()).getWindow().getDecorView();
5667
mDecorView.getLocationOnScreen(mDecorViewLocation);
68+
mAnimatorMap = new HashMap<>();
5769
}
5870

5971
public void setRemovedListener(ItemRemovedListener listener) {
@@ -70,16 +82,25 @@ public boolean onTouchEvent(MotionEvent e) {
7082
float touchY = e.getY();
7183
switch (e.getAction()) {
7284
case MotionEvent.ACTION_DOWN:
73-
mTopViewX = topView.getX();
74-
mTopViewY = topView.getY();
85+
if (mAnimatorMap.containsKey(topView)) {
86+
mAnimatorMap.get(topView).cancel();
87+
mAnimatorMap.remove(topView);
88+
mTopViewOffsetX = topView.getX();
89+
mTopViewOffsetY = topView.getY();
90+
} else {
91+
mTopViewX = topView.getX();
92+
mTopViewY = topView.getY();
93+
mTopViewOffsetX = 0;
94+
mTopViewOffsetY = 0;
95+
}
7596
mTouchDownX = touchX;
7697
mTouchDownY = touchY;
7798
break;
7899
case MotionEvent.ACTION_MOVE:
79100
float dx = touchX - mTouchDownX;
80101
float dy = touchY - mTouchDownY;
81-
topView.setX(mTopViewX + dx);
82-
topView.setY(mTopViewY + dy);
102+
topView.setX(mTopViewX + dx + mTopViewOffsetX);
103+
topView.setY(mTopViewY + dy + mTopViewOffsetY);
83104
updateNextItem(Math.abs(topView.getX() - mTopViewX) * 0.2 / mBorder + 0.8);
84105
break;
85106
case MotionEvent.ACTION_UP:
@@ -130,7 +151,7 @@ private void touchUp(final View view) {
130151
mRemovedListener.onLeftRemoved();
131152
}
132153
View animView = view;
133-
TimeInterpolator interpolator = null;
154+
TimeInterpolator interpolator;
134155
if (del) {
135156
animView = getMirrorView(view);
136157
float offsetX = getX() - mDecorView.getX();
@@ -150,6 +171,9 @@ private void touchUp(final View view) {
150171
.setListener(new Animator.AnimatorListener() {
151172
@Override
152173
public void onAnimationStart(Animator animation) {
174+
if (!finalDel) {
175+
mAnimatorMap.put(finalAnimView, animation);
176+
}
153177
}
154178

155179
@Override
@@ -160,6 +184,8 @@ public void onAnimationEnd(Animator animation) {
160184
} catch (Exception e) {
161185
e.printStackTrace();
162186
}
187+
} else {
188+
mAnimatorMap.remove(finalAnimView);
163189
}
164190
}
165191

@@ -231,5 +257,4 @@ private ImageView getMirrorView(View view) {
231257
mDecorView.addView(mirrorView, params);
232258
return mirrorView;
233259
}
234-
235260
}

0 commit comments

Comments
 (0)