Skip to content

Commit 0d4200e

Browse files
committed
修正卡片排序问题
1 parent 56466f2 commit 0d4200e

File tree

8 files changed

+90
-40
lines changed

8 files changed

+90
-40
lines changed

cardstackview/src/main/java/me/brucezz/cardstackview/AnimatorListenerImpl.java renamed to cardstackview/src/main/java/me/brucezz/cardstackview/AnimationCancelListener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
99
*/
1010

11-
public class AnimatorListenerImpl implements Animator.AnimatorListener {
11+
public class AnimationCancelListener implements Animator.AnimatorListener {
1212
private CardHolder mRunning;
1313
private CardHolder mDragging;
1414

15-
public AnimatorListenerImpl(CardHolder running, CardHolder dragging) {
15+
public AnimationCancelListener(CardHolder running, CardHolder dragging) {
1616
mRunning = running;
1717
mDragging = dragging;
1818
}

cardstackview/src/main/java/me/brucezz/cardstackview/CardAdapter.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ public abstract class CardAdapter {
3232
*/
3333
public abstract int getMinCardSpan();
3434

35+
/**
36+
* 获取卡片的排序位置
37+
* 如 原始第 1 张卡片,现在要摆放在第 3 的位置
38+
* 则 getOrder(1) return 3;
39+
*
40+
* @param position 原始卡片的位置
41+
* @return 当前排序所处的位置
42+
*/
43+
public abstract int getOrder(int position);
44+
3545
private final DataSetObservable mObservable = new DataSetObservable();
3646

3747
public final void notifyDataSetChanged() {

cardstackview/src/main/java/me/brucezz/cardstackview/CardFactory.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.view.View;
55
import android.view.ViewGroup;
66
import java.util.ArrayList;
7+
import java.util.Arrays;
78
import java.util.Collections;
89
import java.util.List;
910

@@ -17,14 +18,23 @@ public class CardFactory {
1718
private ArrayList<CardHolder> mCardHolders = new ArrayList<>();
1819

1920
private Options mOptions;
21+
private ViewGroup mParent;
2022

21-
public CardFactory(ViewGroup parent, Options options) {
23+
public CardFactory(ViewGroup parent, Options options, int count) {
24+
mParent = parent;
2225
mOptions = options;
23-
for (int i = 0; i < parent.getChildCount(); i++) {
24-
mCardHolders.add(new CardHolder(parent, parent.getChildAt(i), i, mOptions));
26+
for (int i = 0; i < count; i++) {
27+
mCardHolders.add(null);// 添加 null 占位
2528
}
2629
}
2730

31+
public void add(int orderIndex, int childIndex, View child) {
32+
if (mCardHolders.size() > orderIndex && mCardHolders.get(orderIndex) != null) {
33+
throw new IllegalArgumentException("You have put a card to order #%d" + orderIndex);
34+
}
35+
mCardHolders.set(orderIndex, new CardHolder(mParent, child, childIndex, orderIndex, mOptions));
36+
}
37+
2838
public int size() {
2939
return mCardHolders.size();
3040
}
@@ -84,11 +94,12 @@ public void swapRealIndex(int one, int another) {
8494
}
8595

8696
public List<Integer> getAllPosition() {
87-
List<Integer> all = new ArrayList<>();
88-
for (CardHolder holder : mCardHolders) {
89-
all.add(holder.mChildIndex);
97+
Integer[] orders = new Integer[mCardHolders.size()];
98+
for (int i = 0; i < mCardHolders.size(); i++) {
99+
int childIndex = mCardHolders.get(i).mChildIndex;
100+
orders[childIndex] = i;
90101
}
91102

92-
return all;
103+
return Arrays.asList(orders);
93104
}
94105
}

cardstackview/src/main/java/me/brucezz/cardstackview/CardHolder.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ public class CardHolder {
4343

4444
public Options mOptions;
4545

46-
public CardHolder(ViewGroup parent, View view, int childIndex, Options options) {
46+
public CardHolder(ViewGroup parent, View view, int childIndex, int realIndex, Options options) {
4747
this.mParent = parent;
4848
this.mView = view;
4949
this.mChildIndex = childIndex;
50-
this.mRealIndex = childIndex;
51-
this.mDrawOrder = childIndex;
50+
this.mRealIndex = realIndex;
51+
this.mDrawOrder = realIndex;
5252
this.mOptions = options;
5353
}
5454

@@ -84,10 +84,8 @@ public void reset() {
8484
final int start = this.mView.getTop();
8585
final int end = getFixedTop();
8686

87-
//Log.d(TAG, String.format("reset: View %s reset to %d", this.mView.getTag(), this.mRealIndex));
88-
8987
mRunningAnimator = ValueAnimator.ofFloat(0f, 1f).setDuration(mOptions.CARD_RESET_DURATION);
90-
mRunningAnimator.addUpdateListener(new AnimatorUpdateListenerImpl(this, null, start, end, end));
88+
mRunningAnimator.addUpdateListener(new ViewUpdateListener(this, null, start, end, end));
9189
mRunningAnimator.start();
9290
}
9391

@@ -96,7 +94,6 @@ public void reset() {
9694
*/
9795
private void checkIfAnimatorRunning() {
9896
if (isAnimating()) {
99-
//Log.w(TAG, String.format("checkIfAnimatorRunning: card #%d is animating!", mRealIndex));
10097
mRunningAnimator.cancel();
10198
}
10299
}
@@ -156,11 +153,10 @@ public void onSwap(final CardHolder dragging) {
156153

157154
mDrawOrderUpdated = false;
158155

159-
//Log.d(TAG, "onSwap: start=" + start + ", mid=" + mid + ", end=" + end);
160156
mRunningAnimator = ValueAnimator.ofFloat(0f, 1f);
161157
mRunningAnimator.setDuration(mOptions.CARD_SWAP_DURATION);
162-
mRunningAnimator.addUpdateListener(new AnimatorUpdateListenerImpl(this, dragging, start, mid, end));
163-
mRunningAnimator.addListener(new AnimatorListenerImpl(this, dragging));
158+
mRunningAnimator.addUpdateListener(new ViewUpdateListener(this, dragging, start, mid, end));
159+
mRunningAnimator.addListener(new AnimationCancelListener(this, dragging));
164160
mRunningAnimator.setInterpolator(new OvershootInterpolator(1f));
165161
mRunningAnimator.start();
166162
}
@@ -181,7 +177,7 @@ public void onSelect() {
181177
final int end = start - mOptions.CARD_FLOAT_UP;
182178

183179
mRunningAnimator = ValueAnimator.ofFloat(0f, 1f).setDuration(mOptions.CARD_FLOAT_DURATION);
184-
mRunningAnimator.addUpdateListener(new AnimatorUpdateListenerImpl(this, null, start, end, end));
180+
mRunningAnimator.addUpdateListener(new ViewUpdateListener(this, null, start, end, end));
185181
mRunningAnimator.start();
186182
}
187183
}

cardstackview/src/main/java/me/brucezz/cardstackview/CardStackView.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,17 @@ public CardStackView(Context context, AttributeSet attrs, int defStyleAttr) {
7070

7171
private void initViews() {
7272
mOptions = new Options();
73+
mCardFactory = new CardFactory(this, mOptions, mCardAdapter.getItemCount());
7374

7475
for (int i = 0; i < mCardAdapter.getItemCount(); i++) {
75-
addView(mCardAdapter.getView(null, i, this));
76+
View child = mCardAdapter.getView(null, i, this);
77+
this.addView(child);
78+
mCardFactory.add(mCardAdapter.getOrder(i), i, child);
7679
}
7780

7881
mSlidingResistanceCalculator = new SlidingResistanceCalculator(2000f, mOptions.CARD_SPAN_OFFSET);
7982

8083
updateOptions();
81-
82-
mCardFactory = new CardFactory(this, mOptions);
83-
//Log.d(TAG, "init: " + mCardAdapter.getItemCount());
8484
}
8585

8686
private void initTouchCallback() {
@@ -122,8 +122,6 @@ public int getOrderedChildIndex(int index) {
122122
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
123123
if (changedView != mSelected.mView) return;
124124

125-
//Log.d(TAG, String.format("onViewPositionChanged: left=%d, top=%d, dx=%d, dy=%d", left, top, dx, dy));
126-
127125
CardHolder holder = mCardFactory.findByView(changedView);
128126
if (holder == null) return;
129127

@@ -344,6 +342,10 @@ public interface OnCardClickListener {
344342
}
345343

346344
public interface OnPositionChangedListener {
345+
/**
346+
* @param position 原始卡片对应当前排序的位置
347+
* 如原始第 1 张卡片现在排在第 3 个,则 position.get(1) = 3
348+
*/
347349
void onPositionChanged(List<Integer> position);
348350
}
349351

cardstackview/src/main/java/me/brucezz/cardstackview/AnimatorUpdateListenerImpl.java renamed to cardstackview/src/main/java/me/brucezz/cardstackview/ViewUpdateListener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
99
*/
1010

11-
public class AnimatorUpdateListenerImpl implements ValueAnimator.AnimatorUpdateListener {
11+
public class ViewUpdateListener implements ValueAnimator.AnimatorUpdateListener {
1212

1313
private CardHolder mRunning;
1414
private CardHolder mDragging;
1515
private int mStart, mMid, mEnd;
1616

17-
public AnimatorUpdateListenerImpl(CardHolder running, CardHolder dragging, int start, int mid, int end) {
17+
public ViewUpdateListener(CardHolder running, CardHolder dragging, int start, int mid, int end) {
1818
mRunning = running;
1919
mDragging = dragging;
2020
mStart = start;

sample/src/main/java/me/brucezz/sample/MainActivity.java

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
import android.animation.ArgbEvaluator;
55
import android.animation.ValueAnimator;
66
import android.content.Intent;
7+
import android.content.SharedPreferences;
78
import android.os.Bundle;
9+
import android.preference.PreferenceManager;
810
import android.support.annotation.ColorInt;
11+
import android.support.v4.util.Pair;
912
import android.support.v7.app.AppCompatActivity;
1013
import android.support.v7.widget.CardView;
1114
import android.support.v7.widget.Toolbar;
12-
import android.util.Log;
15+
import android.text.TextUtils;
1316
import android.view.View;
1417
import android.view.ViewGroup;
1518
import android.widget.ImageView;
@@ -26,9 +29,10 @@ public class MainActivity extends AppCompatActivity {
2629

2730
CardStackView mCardStackView;
2831
SimpleCardAdapter mCardAdapter;
29-
private List<Card> mCards;
32+
private List<Pair<Integer, Card>> mCards;
3033

3134
private AnimationHelper mHelper;
35+
private SharedPreferences mPreferences;
3236

3337
@Override
3438
protected void onCreate(Bundle savedInstanceState) {
@@ -51,19 +55,40 @@ public void onPositionChanged(List<Integer> position) {
5155
for (Integer integer : position) {
5256
sb.append(integer).append(" ");
5357
}
54-
Log.d("TAG", "onPositionChanged: " + sb.toString());
58+
mPreferences.edit().putString("order", sb.toString()).apply();
5559
}
5660
});
5761

58-
mCards = fakeCards();
62+
mPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
63+
String order = mPreferences.getString("order", "");
64+
int[] orders;
65+
if (TextUtils.isEmpty(order)) {
66+
orders = new int[] { 0, 1, 2, 3 };
67+
} else {
68+
String[] ordersArr = order.trim().split(" ");
69+
orders = new int[ordersArr.length];
70+
for (int i = 0; i < ordersArr.length; i++) {
71+
orders[i] = Integer.valueOf(ordersArr[i]);
72+
}
73+
}
74+
mCards = initCards(orders);
5975
mCardAdapter = new SimpleCardAdapter(this, mCards);
6076

6177
mCardStackView.setAdapter(mCardAdapter);
78+
79+
mToolbar.setOnClickListener(new View.OnClickListener() {
80+
@Override
81+
public void onClick(View v) {
82+
System.out.println(mPreferences.getString("order", ""));
83+
}
84+
});
6285
}
6386

64-
private List<Card> fakeCards() {
65-
return Arrays.asList(new Card(0xFF2196F3, R.drawable.post, "动态"), new Card(0xFF17B084, R.drawable.task, "任务"),
66-
new Card(0xFFE85D72, R.drawable.calendar, "日程"), new Card(0xFF00BACF, R.drawable.knowledge, "知识"));
87+
private List<Pair<Integer, Card>> initCards(int... orders) {
88+
return Arrays.asList(Pair.create(orders[0], new Card(0xFF00BACF, R.drawable.knowledge, "知识")),
89+
Pair.create(orders[1], new Card(0xFFE85D72, R.drawable.calendar, "日程")),
90+
Pair.create(orders[2], new Card(0xFF17B084, R.drawable.task, "任务")),
91+
Pair.create(orders[3], new Card(0xFF2196F3, R.drawable.post, "动态")));
6792
}
6893

6994
private void toggleAnimation(final View view, final int index) {
@@ -129,7 +154,7 @@ public AnimationHelper(View view, int index) {
129154
endRadius = 1f;// radius 减到 0 会自动产生透明度变化
130155

131156
startColor = getResources().getColor(R.color.colorPrimaryDark);
132-
endColor = mCards.get(mIndex).mBgColor;
157+
endColor = mCards.get(mIndex).second.mBgColor;
133158

134159
startElevation = mCardView.getMaxCardElevation();
135160
endElevation = 0f;
@@ -186,7 +211,7 @@ public void onAnimationEnd(Animator animation) {
186211
mFoo.animate().alpha(1f).setDuration(ANIMATION_DURATION_ALPHA).start();
187212
} else {
188213
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
189-
intent.putExtra("card", mCards.get(mIndex));
214+
intent.putExtra("card", mCards.get(mIndex).second);
190215
startActivityForResult(intent, REQ_DETAIL);
191216
overridePendingTransition(0, 0);
192217
}

sample/src/main/java/me/brucezz/sample/SimpleCardAdapter.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.content.Context;
44
import android.os.Build;
5+
import android.support.v4.util.Pair;
56
import android.support.v7.widget.CardView;
67
import android.view.LayoutInflater;
78
import android.view.View;
@@ -20,16 +21,16 @@
2021
public class SimpleCardAdapter extends CardAdapter {
2122

2223
private Context mContext;
23-
private List<Card> mCards;
24+
private List<Pair<Integer, Card>> mCards;
2425

25-
public SimpleCardAdapter(Context context, List<Card> cards) {
26+
public SimpleCardAdapter(Context context, List<Pair<Integer, Card>> cards) {
2627
mContext = context;
2728
mCards = cards;
2829
}
2930

3031
@Override
3132
public View getView(View oldView, int position, ViewGroup parent) {
32-
Card card = mCards.get(position);
33+
Card card = mCards.get(position).second;
3334

3435
ViewHolder holder;
3536
View view;
@@ -70,6 +71,11 @@ public int getMinCardSpan() {
7071
return mContext.getResources().getDimensionPixelSize(R.dimen.card_span_min);
7172
}
7273

74+
@Override
75+
public int getOrder(int position) {
76+
return mCards.get(position).first;
77+
}
78+
7379
private static class ViewHolder {
7480
CardView mCardView;
7581
TextView mTextView;

0 commit comments

Comments
 (0)