Skip to content

Commit

Permalink
1. 增加IndexBarDataObservable、IndexBarDataObserver,通知IndexBar数据更新
Browse files Browse the repository at this point in the history
2. 虽然可以通过HeaderFooterDataObserver#onChanged()方法来通知IndexBar数据更新,最后还是选择方法1
  • Loading branch information
sunguodong committed Mar 3, 2017
1 parent 3ca9c42 commit 593c662
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@

import me.yokeyword.indexablerv.database.HeaderFooterDataObservable;
import me.yokeyword.indexablerv.database.HeaderFooterDataObserver;
import me.yokeyword.indexablerv.database.IndexBarDataObservable;
import me.yokeyword.indexablerv.database.IndexBarDataObserver;

/**
* Created by YoKey on 16/10/16.
*/

abstract class AbstractHeaderFooterAdapter<T> {
private final HeaderFooterDataObservable mDataSetObservable = new HeaderFooterDataObservable();
private final IndexBarDataObservable mIndexBarDataSetObservable = new IndexBarDataObservable();

ArrayList<EntityWrapper<T>> mEntityWrapperList = new ArrayList<>();
protected OnItemClickListener<T> mListener;
Expand Down Expand Up @@ -85,6 +88,7 @@ public void addData(T data) {

if (size > 0) {
mDataSetObservable.notifyAdd(getHeaderFooterType() == EntityWrapper.TYPE_HEADER, mEntityWrapperList.get(size - 1), wrapper);
mIndexBarDataSetObservable.notifyChanged();
}
}

Expand All @@ -93,6 +97,7 @@ public void removeData(T data) {
if (wrapper.getData() == data) {
mEntityWrapperList.remove(wrapper);
mDataSetObservable.notifyRemove(getHeaderFooterType() == EntityWrapper.TYPE_HEADER, wrapper);
mIndexBarDataSetObservable.notifyChanged();
return;
}
}
Expand All @@ -114,6 +119,7 @@ public void addData(int position, T data) {

if (size > 0) {
mDataSetObservable.notifyAdd(getHeaderFooterType() == EntityWrapper.TYPE_HEADER, mEntityWrapperList.get(position - 1), wrapper);
mIndexBarDataSetObservable.notifyChanged();
}
}

Expand Down Expand Up @@ -164,6 +170,14 @@ void unregisterDataSetObserver(HeaderFooterDataObserver observer) {
mDataSetObservable.unregisterObserver(observer);
}

void registerIndexBarDataSetObserver(IndexBarDataObserver observer) {
mIndexBarDataSetObservable.registerObserver(observer);
}

void unregisterIndexBarDataSetObserver(IndexBarDataObserver observer) {
mIndexBarDataSetObservable.unregisterObserver(observer);
}

interface OnItemClickListener<T> {
void onItemClick(View v, int currentPosition, T entity);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,8 @@ List<String> getIndexList() {

void setDatas(boolean showAllLetter, ArrayList<EntityWrapper> datas) {
this.mDatas = datas;
this.mIndexList.clear();
this.mMapping.clear();

ArrayList<String> tempHeaderList = null;
if (showAllLetter) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import me.yokeyword.indexablerecyclerview.R;
import me.yokeyword.indexablerv.database.DataObserver;
import me.yokeyword.indexablerv.database.HeaderFooterDataObserver;
import me.yokeyword.indexablerv.database.IndexBarDataObserver;

/**
* RecyclerView + IndexBar
Expand Down Expand Up @@ -105,6 +106,13 @@ public void onRemove(boolean header, EntityWrapper data) {
}
};

private IndexBarDataObserver mIndexBarDataSetObserver = new IndexBarDataObserver() {
@Override
public void onChanged() {
mIndexBar.setDatas(mShowAllLetter, mRealAdapter.getItems());
}
};

public IndexableLayout(Context context) {
this(context, null);
}
Expand Down Expand Up @@ -178,6 +186,7 @@ public void onSetListener(int type) {
*/
public <T> void addHeaderAdapter(IndexableHeaderAdapter<T> adapter) {
adapter.registerDataSetObserver(mHeaderFooterDataSetObserver);
adapter.registerIndexBarDataSetObserver(mIndexBarDataSetObserver);
mRealAdapter.addIndexableHeaderAdapter(adapter);
}

Expand All @@ -187,6 +196,7 @@ public <T> void addHeaderAdapter(IndexableHeaderAdapter<T> adapter) {
public <T> void removeHeaderAdapter(IndexableHeaderAdapter<T> adapter) {
try {
adapter.unregisterDataSetObserver(mHeaderFooterDataSetObserver);
adapter.unregisterIndexBarDataSetObserver(mIndexBarDataSetObserver);
mRealAdapter.removeIndexableHeaderAdapter(adapter);
} catch (Exception ignored) {
}
Expand All @@ -197,6 +207,7 @@ public <T> void removeHeaderAdapter(IndexableHeaderAdapter<T> adapter) {
*/
public <T> void addFooterAdapter(IndexableFooterAdapter<T> adapter) {
adapter.registerDataSetObserver(mHeaderFooterDataSetObserver);
adapter.registerIndexBarDataSetObserver(mIndexBarDataSetObserver);
mRealAdapter.addIndexableFooterAdapter(adapter);
}

Expand All @@ -206,6 +217,7 @@ public <T> void addFooterAdapter(IndexableFooterAdapter<T> adapter) {
public <T> void removeFooterAdapter(IndexableFooterAdapter<T> adapter) {
try {
adapter.unregisterDataSetObserver(mHeaderFooterDataSetObserver);
adapter.unregisterIndexBarDataSetObserver(mIndexBarDataSetObserver);
mRealAdapter.removeIndexableFooterAdapter(adapter);
} catch (Exception ignored) {
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package me.yokeyword.indexablerv.database;

import android.database.Observable;

/**
* Created by Sun on 16/10/13.
*/
public class IndexBarDataObservable extends Observable<IndexBarDataObserver> {

public void notifyChanged() {
synchronized (mObservers) {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onChanged();
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package me.yokeyword.indexablerv.database;

/**
* Created by Sun on 16/10/13.
*/
public class IndexBarDataObserver {

/**
* This method is called when the entire data set has changed,
* refresh UI
*/
public void onChanged() {
// Do nothing
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import android.support.v7.widget.SearchView;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -29,6 +30,7 @@ public class PickCityActivity extends AppCompatActivity {
private SearchFragment mSearchFragment;
private SearchView mSearchView;
private FrameLayout mProgressBar;
private SimpleHeaderAdapter mHotCityAdapter;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
Expand Down Expand Up @@ -88,13 +90,17 @@ public void onItemClick(View v, int currentPosition, String indexTitle) {
// 添加 HeaderView DefaultHeaderAdapter接收一个IndexableAdapter, 使其布局以及点击事件和IndexableAdapter一致
// 如果想自定义布局,点击事件, 可传入 new IndexableHeaderAdapter

mHotCityAdapter = new SimpleHeaderAdapter<>(adapter, "热", "热门城市", iniyHotCityDatas());
// 热门城市
indexableLayout.addHeaderAdapter(new SimpleHeaderAdapter<>(adapter, "热", "热门城市", iniyHotCityDatas()));
indexableLayout.addHeaderAdapter(mHotCityAdapter);
// 定位
final List<CityEntity> gpsCity = iniyGPSCityDatas();
final SimpleHeaderAdapter gpsHeaderAdapter = new SimpleHeaderAdapter<>(adapter, "定", "当前城市", gpsCity);
indexableLayout.addHeaderAdapter(gpsHeaderAdapter);

// 显示真实索引
// indexableLayout.showAllLetter(false);

// 模拟定位
indexableLayout.postDelayed(new Runnable() {
@Override
Expand All @@ -108,6 +114,17 @@ public void run() {
initSearch();
}

// 更新数据点击事件
public void update(View view) {
List<CityEntity> list = new ArrayList<>();
list.add(new CityEntity("杭州市"));
list.add(new CityEntity("北京市"));
list.add(new CityEntity("上海市"));
list.add(new CityEntity("广州市"));
mHotCityAdapter.addDatas(list);
Toast.makeText(this, "更新数据", Toast.LENGTH_SHORT).show();
}

private List<CityEntity> initDatas() {
List<CityEntity> list = new ArrayList<>();
List<String> cityStrings = Arrays.asList(getResources().getStringArray(R.array.city_array));
Expand Down
8 changes: 8 additions & 0 deletions sample/src/main/res/layout/activity_pick_city.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,13 @@
android:layout_height="56dp"
android:layout_gravity="center"/>
</FrameLayout>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:text="更新数据"
android:onClick="update"/>

</FrameLayout>
</LinearLayout>

0 comments on commit 593c662

Please sign in to comment.