Skip to content

Commit 437d791

Browse files
committed
add notify method 
1 parent 99f859c commit 437d791

5 files changed

Lines changed: 95 additions & 12 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ buildscript {
55
jcenter()
66
}
77
dependencies {
8-
classpath 'com.android.tools.build:gradle:2.2.1'
8+
classpath 'com.android.tools.build:gradle:2.2.2'
99
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
1010

1111
// NOTE: Do not place your application dependencies here; they belong

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package me.brucezz.cardstackview;
22

3+
import android.database.DataSetObservable;
4+
import android.database.DataSetObserver;
35
import android.view.View;
46
import android.view.ViewGroup;
57

@@ -13,7 +15,7 @@ public abstract class CardAdapter {
1315
/**
1416
* 会在 {@link CardStackView} 初始化的时候把所有的 View 都初始化添加进去
1517
*/
16-
public abstract View getView(int position, ViewGroup parent);
18+
public abstract View getView(View oldView, int position, ViewGroup parent);
1719

1820
/**
1921
* 获取 View 的数量
@@ -29,4 +31,18 @@ public abstract class CardAdapter {
2931
* View 最小间隔
3032
*/
3133
public abstract int getMinCardSpan();
34+
35+
private final DataSetObservable mObservable = new DataSetObservable();
36+
37+
public final void notifyDataSetChanged() {
38+
mObservable.notifyChanged();
39+
}
40+
41+
public void registerDataSetObserver(DataSetObserver observer) {
42+
mObservable.registerObserver(observer);
43+
}
44+
45+
public void unregisterDataSetObserver(DataSetObserver observer) {
46+
mObservable.unregisterObserver(observer);
47+
}
3248
}

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

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import android.animation.ValueAnimator;
44
import android.content.Context;
5+
import android.database.DataSetObserver;
56
import android.support.v4.view.GestureDetectorCompat;
67
import android.support.v4.widget.ViewDragHelper;
78
import android.util.AttributeSet;
8-
import android.util.Log;
99
import android.view.GestureDetector;
1010
import android.view.MotionEvent;
1111
import android.view.View;
@@ -21,6 +21,8 @@
2121
public class CardStackView extends ViewGroup {
2222
private static final String TAG = "CardStackView";
2323

24+
private final DataSetObserver mObserver = new CardStackViewDataObserver();
25+
2426
private CardFactory mCardFactory;
2527
private Options mOptions;
2628

@@ -55,7 +57,7 @@ public CardStackView(Context context, AttributeSet attrs, int defStyleAttr) {
5557

5658
private void initViews() {
5759
for (int i = 0; i < mCardAdapter.getItemCount(); i++) {
58-
addView(mCardAdapter.getView(i, this));
60+
addView(mCardAdapter.getView(null, i, this));
5961
}
6062
mOptions = new Options();
6163

@@ -271,8 +273,13 @@ private void updateCardPosition() {
271273
}
272274

273275
public void setAdapter(CardAdapter adapter) {
276+
if (mCardAdapter != null) {
277+
mCardAdapter.unregisterDataSetObserver(mObserver);
278+
}
279+
274280
this.mCardAdapter = adapter;
275281
if (mCardAdapter != null && mCardAdapter.getItemCount() > 0) {
282+
mCardAdapter.registerDataSetObserver(mObserver);
276283
initViews();
277284
}
278285
}
@@ -307,4 +314,22 @@ public interface onCardClickListener {
307314
*/
308315
void onClick(View view, int realIndex, int initialIndex);
309316
}
317+
318+
private class CardStackViewDataObserver extends DataSetObserver {
319+
@Override
320+
public void onChanged() {
321+
for (int i = 0; i < mCardFactory.size(); i++) {
322+
CardHolder holder = mCardFactory.get(i);
323+
holder.mView = mCardAdapter.getView(holder.mView, holder.mChildIndex, CardStackView.this);
324+
}
325+
}
326+
327+
@Override
328+
public void onInvalidated() {
329+
for (int i = 0; i < mCardFactory.size(); i++) {
330+
CardHolder holder = mCardFactory.get(i);
331+
holder.mView.postInvalidate();
332+
}
333+
}
334+
}
310335
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import android.os.Bundle;
44
import android.support.v7.app.AppCompatActivity;
5+
import android.view.Menu;
6+
import android.view.MenuItem;
57
import android.view.View;
68
import android.widget.Toast;
79
import java.util.Arrays;
@@ -39,4 +41,27 @@ private List<Card> fakeCards() {
3941
return Arrays.asList(new Card(0xFF2196F3, R.drawable.post, "动态"), new Card(0xFF17B084, R.drawable.task, "任务"),
4042
new Card(0xFFE85D72, R.drawable.calendar, "日程"), new Card(0xFF00BACF, R.drawable.knowledge, "知识"));
4143
}
44+
45+
@Override
46+
public boolean onCreateOptionsMenu(Menu menu) {
47+
menu.add(1, 1, 1, "修改数据");
48+
menu.add(1, 2, 1, "重置");
49+
return super.onCreateOptionsMenu(menu);
50+
}
51+
52+
@Override
53+
public boolean onOptionsItemSelected(MenuItem item) {
54+
switch (item.getItemId()) {
55+
case 1:
56+
for (Card card : mCards) {
57+
card.mTitle += "X";
58+
}
59+
mCardAdapter.notifyDataSetChanged();
60+
break;
61+
case 2:
62+
recreate();
63+
break;
64+
}
65+
return super.onOptionsItemSelected(item);
66+
}
4267
}

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

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,30 @@ public SimpleCardAdapter(Context context, List<Card> cards) {
2828
}
2929

3030
@Override
31-
public View getView(int position, ViewGroup parent) {
31+
public View getView(View oldView, int position, ViewGroup parent) {
3232
Card card = mCards.get(position);
33-
View view = LayoutInflater.from(mContext).inflate(R.layout.item_card, parent, false);
34-
CardView cardView = (CardView) view.findViewById(R.id.card);
35-
TextView title = (TextView) view.findViewById(R.id.card_title);
36-
ImageView image = (ImageView) view.findViewById(R.id.card_image);
3733

38-
title.setText(card.mTitle);
39-
image.setImageResource(card.mImage);
34+
ViewHolder holder;
35+
View view;
36+
if (oldView != null && oldView.getTag() instanceof ViewHolder) {
37+
holder = (ViewHolder) oldView.getTag();
38+
view = oldView;
39+
} else {
40+
holder = new ViewHolder();
41+
view = LayoutInflater.from(mContext).inflate(R.layout.item_card, parent, false);
42+
holder.mCardView = (CardView) view.findViewById(R.id.card);
43+
holder.mTextView = (TextView) view.findViewById(R.id.card_title);
44+
holder.mImageView = (ImageView) view.findViewById(R.id.card_image);
45+
}
46+
47+
holder.mTextView.setText(card.mTitle);
48+
holder.mImageView.setImageResource(card.mImage);
4049
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
4150
// BugFix: 4.x 版本: CardView 中填充 ImageView 会有白边
42-
cardView.setCardBackgroundColor(card.mBgColor);
51+
holder.mCardView.setCardBackgroundColor(card.mBgColor);
4352
}
53+
view.setTag(holder);
54+
4455
return view;
4556
}
4657

@@ -58,4 +69,10 @@ public int getCardHeight() {
5869
public int getMinCardSpan() {
5970
return mContext.getResources().getDimensionPixelSize(R.dimen.card_span_min);
6071
}
72+
73+
private static class ViewHolder {
74+
CardView mCardView;
75+
TextView mTextView;
76+
ImageView mImageView;
77+
}
6178
}

0 commit comments

Comments
 (0)