下面列出了androidx.recyclerview.widget.RecyclerView#AdapterDataObserver ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Fixes internal dependencies to android.database.Observable so that a RecyclerView.Adapter can
* be tested using regular unit tests while verifying changes to the data.
*
* <p>Pulled from:
* https://github.com/badoo/Chateau/blob/master/ExampleApp/src/test/java/com/badoo/chateau/example/ui/utils/TestUtils.java
*/
public static RecyclerView.AdapterDataObserver fixAdapterForTesting(RecyclerView.Adapter adapter)
throws NoSuchFieldException, IllegalAccessException {
// Observables are not mocked by default so we need to hook the adapter up to an observer so we can track changes
Field observableField = RecyclerView.Adapter.class.getDeclaredField("mObservable");
observableField.setAccessible(true);
Object observable = observableField.get(adapter);
Field observersField = Observable.class.getDeclaredField("mObservers");
observersField.setAccessible(true);
final ArrayList<Object> observers = new ArrayList<>();
RecyclerView.AdapterDataObserver dataObserver =
createMock(RecyclerView.AdapterDataObserver.class);
observers.add(dataObserver);
observersField.set(observable, observers);
return dataObserver;
}
/**
* 注册 Adapter 观察者
* @param recyclerView {@link RecyclerView}
* @param adapterDataObserver Adapter 观察者
* @param isRefAdapter 是否刷新适配器
*/
public void registerAdapterDataObserver(RecyclerView recyclerView, RecyclerView.AdapterDataObserver adapterDataObserver, boolean isRefAdapter) {
if (recyclerView != null) {
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter != null) {
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
// 获取数据总数
int itemCount = adapter.getItemCount();
// 如果为 null 特殊处理
ViewUtils.reverseVisibilitys(itemCount != 0, vid_ba_content_linear, vid_ba_state_linear);
// 判断是否不存在数据
if (itemCount == 0) {
stateLayout.showEmptyData();
}
if (adapterDataObserver != null) {
adapterDataObserver.onChanged();
}
}
});
// 刷新适配器
if (isRefAdapter) adapter.notifyDataSetChanged();
}
}
}
/**
* 注册 Adapter 观察者
* @param recyclerView {@link RecyclerView}
* @param adapterDataObserver Adapter 观察者
* @param isRefAdapter 是否刷新适配器
*/
public void registerAdapterDataObserver(RecyclerView recyclerView, RecyclerView.AdapterDataObserver adapterDataObserver, boolean isRefAdapter) {
if (recyclerView != null) {
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter != null) {
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
// 获取数据总数
int itemCount = adapter.getItemCount();
// 如果为 null 特殊处理
ViewUtils.reverseVisibilitys(itemCount != 0, vid_ba_content_linear, vid_ba_state_linear);
// 判断是否不存在数据
if (itemCount == 0) {
stateLayout.showEmptyData();
}
if (adapterDataObserver != null) {
adapterDataObserver.onChanged();
}
}
});
// 刷新适配器
if (isRefAdapter) adapter.notifyDataSetChanged();
}
}
}
@Override
public void bindParentAdapter(@Nullable CompositeRecyclerAdapter adapter, @Nullable RecyclerView.AdapterDataObserver dataObserver) {
if (hasParentAdapter()) {
throw new IllegalStateException("Adapter already has parentAdapter.");
}
parentAdapter = new WeakReference<>(adapter);
registerAdapterDataObserver(dataObserver);
}
@Override
public void bindParentAdapter(@Nullable CompositeRecyclerAdapter adapter, @Nullable RecyclerView.AdapterDataObserver dataObserver) {
if (hasParentAdapter()) {
throw new IllegalStateException("Adapter already has parentAdapter.");
}
parentAdapter = new WeakReference<>(adapter);
registerAdapterDataObserver(dataObserver);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_pager_page, container, false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.mainGallery);
recyclerView.setHasFixedSize(true);
((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
RecyclerView.LayoutManager layoutManager = getLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
emptyView = rootView.findViewById(R.id.emptyListView);
dividerSize = getResources().getDimensionPixelSize(R.dimen.grid_divider_width);
addItemDecoration(recyclerView);
observer = new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
emptyView.setVisibility(recyclerView.getAdapter().getItemCount() == 0 ? View.VISIBLE : View.INVISIBLE);
}
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
emptyView.setVisibility(recyclerView.getAdapter().getItemCount() == 0 ? View.VISIBLE : View.INVISIBLE);
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
super.onItemRangeRemoved(positionStart, itemCount);
emptyView.setVisibility(recyclerView.getAdapter().getItemCount() == 0 ? View.VISIBLE : View.INVISIBLE);
}
};
return rootView;
}
@Override
public void attachToPager(@NonNull final ScrollingPagerIndicator indicator, @NonNull final RecyclerView pager) {
if (!(pager.getLayoutManager() instanceof LinearLayoutManager)) {
throw new IllegalStateException("Only LinearLayoutManager is supported");
}
if (pager.getAdapter() == null) {
throw new IllegalStateException("RecyclerView has not Adapter attached");
}
this.layoutManager = (LinearLayoutManager) pager.getLayoutManager();
this.recyclerView = pager;
this.attachedAdapter = pager.getAdapter();
this.indicator = indicator;
dataObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
indicator.setDotCount(attachedAdapter.getItemCount());
updateCurrentOffset();
}
@Override
public void onItemRangeChanged(int positionStart, int itemCount) {
onChanged();
}
@Override
public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
onChanged();
}
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
onChanged();
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
onChanged();
}
@Override
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
onChanged();
}
};
attachedAdapter.registerAdapterDataObserver(dataObserver);
indicator.setDotCount(attachedAdapter.getItemCount());
updateCurrentOffset();
scrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE && isInIdleState()) {
int newPosition = findCompletelyVisiblePosition();
if (newPosition != RecyclerView.NO_POSITION) {
indicator.setDotCount(attachedAdapter.getItemCount());
if (newPosition < attachedAdapter.getItemCount()) {
indicator.setCurrentPosition(newPosition);
}
}
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
updateCurrentOffset();
}
};
recyclerView.addOnScrollListener(scrollListener);
}
@Override
public void attachToPager(@NonNull final ScrollingPagerIndicator indicator, @NonNull final ViewPager2 pager) {
attachedAdapter = pager.getAdapter();
if (attachedAdapter == null) {
throw new IllegalStateException("Set adapter before call attachToPager() method");
}
this.pager = pager;
updateIndicatorDotsAndPosition(indicator);
dataSetObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
indicator.reattach();
}
};
attachedAdapter.registerAdapterDataObserver(dataSetObserver);
onPageChangeListener = new ViewPager2.OnPageChangeCallback() {
boolean idleState = true;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixel) {
updateIndicatorOnPagerScrolled(indicator, position, positionOffset);
}
@Override
public void onPageSelected(int position) {
if (idleState) {
updateIndicatorDotsAndPosition(indicator);
}
}
@Override
public void onPageScrollStateChanged(int state) {
idleState = state == ViewPager2.SCROLL_STATE_IDLE;
}
};
pager.registerOnPageChangeCallback(onPageChangeListener);
}
@Override
public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
super.registerAdapterDataObserver(observer);
mAdapter.registerAdapterDataObserver(observer);
}
@Override
public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
super.unregisterAdapterDataObserver(observer);
mAdapter.unregisterAdapterDataObserver(observer);
}
@Override
public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
mChildAdapter.registerAdapterDataObserver(observer);
}
@Override
public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
mChildAdapter.unregisterAdapterDataObserver(observer);
}
public RecyclerView.AdapterDataObserver getAdapterDataObserver() {
return mAdapterDataObserver;
}
public RecyclerView.AdapterDataObserver getAdapterDataObserver() {
return adapterDataObserver;
}
@Override
public final void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
super.registerAdapterDataObserver(observer);
mAdapterDataObservers.add(observer);
updateObserver();
}
public RecyclerView.AdapterDataObserver getAdapterDataObserver() {
return mAdapterDataObserver;
}
@Override
public void registerAdapterDataObserver(@NonNull RecyclerView.AdapterDataObserver observer) {
super.registerAdapterDataObserver(observer);
}
@Override
public void unregisterAdapterDataObserver(@NonNull RecyclerView.AdapterDataObserver observer) {
super.unregisterAdapterDataObserver(observer);
}
@Override public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
super.registerAdapterDataObserver(observer);
mAdapter.registerAdapterDataObserver(observer);
}
void bindParentAdapter(@Nullable CompositeRecyclerAdapter adapter, @Nullable RecyclerView.AdapterDataObserver dataObserver);