private void doRegister(@NonNull Linker<T> linker) { for (ItemViewBinder<T, ?> binder : binders) { adapter.register(clazz, binder, linker); } } }
@Test public void testOnCreateViewHolder() { MultiTypeAdapter adapter = new MultiTypeAdapter(); adapter.register(TestItem.class, mockedItemViewBinder); TestItem item = new TestItem("testOnCreateViewHolder"); adapter.setItems(Collections.singletonList(item)); int type = adapter.getItemViewType(0); adapter.onCreateViewHolder(parent, type); verify(mockedItemViewBinder).onCreateViewHolder(inflater, parent); }
@Override public void onShowNetError() { Snackbar.make(scrollView, R.string.network_error, Snackbar.LENGTH_SHORT).show(); getActivity().runOnUiThread(() -> { adapter.setItems(new Items()); adapter.notifyDataSetChanged(); canLoadMore = false; }); } }
/** A safe register method base on the TypePool's safety for TypePool. */ @SuppressWarnings("unchecked") private void registerWithoutChecking(@NonNull Class clazz, @NonNull ItemViewBinder binder, @NonNull Linker linker) { checkAndRemoveAllTypesIfNeeded(clazz); register(clazz, binder, linker); } }
@Test @SuppressWarnings("deprecation") public void testOnBindViewHolder() { MultiTypeAdapter adapter = new MultiTypeAdapter(); adapter.register(TestItem.class, mockedItemViewBinder); TestItem item = new TestItem("testOnCreateViewHolder"); adapter.setItems(Collections.singletonList(item)); TestItemViewBinder.ViewHolder holder = mock(TestItemViewBinder.ViewHolder.class); when(holder.getItemViewType()).thenReturn(adapter.getItemViewType(0)); adapter.onBindViewHolder(holder, 0); verify(mockedItemViewBinder).onBindViewHolder(eq(holder), eq(item), anyList()); List<Object> payloads = Collections.emptyList(); adapter.onBindViewHolder(holder, 0, payloads); verify(mockedItemViewBinder, times(2)).onBindViewHolder(holder, item, payloads); } }
@Test(expected = IllegalStateException.class) public void shouldThrowIllegalStateException() { MultiTypeAdapter adapter = new MultiTypeAdapter(); Items empty = new Items(); adapter.setItems(empty); TestItemViewBinder binder = new TestItemViewBinder(); empty.add(new TestItem("ItemViewBinderTest")); binder.notifyTestItemAdded(); adapter.register(TestItem.class, binder); }
@Override protected void initView(View view) { super.initView(view); adapter = new MultiTypeAdapter(oldItems); Register.registerMediaArticleItem(adapter); recyclerView.setAdapter(adapter); recyclerView.addOnScrollListener(new OnLoadMoreListener() { @Override public void onLoadMore() { if (canLoadMore) { canLoadMore = false; presenter.doLoadMoreData(TYPE_VIDEO); } } }); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_adapter); rv = findViewById(R.id.rv); rv.setLayoutManager(new LinearLayoutManager(this)); mMultiTypeAdapter = new MultiTypeAdapter(); mMultiTypeAdapter.register(AttributeWithType.class).to(new NameBinder(), new AddressBinder()).withClassLinker(new ClassLinker<AttributeWithType>() { @NonNull @Override public Class<? extends ItemViewBinder<AttributeWithType, ?>> index(int position, @NonNull AttributeWithType attributeWithType) { return attributeWithType.getAttributes() instanceof Name ? NameBinder.class : AddressBinder.class; } }); rv.setAdapter(mMultiTypeAdapter); loadData(); }
@Test public void shouldOverrideRegisteredBinder() { MultiTypeAdapter adapter = new MultiTypeAdapter(); adapter.register(TestItem.class, itemViewBinder); assertEquals(1, adapter.getTypePool().size()); assertEquals(itemViewBinder, adapter.getTypePool().getItemViewBinder(0)); TestItemViewBinder newBinder = new TestItemViewBinder(); adapter.register(TestItem.class, newBinder); assertEquals(newBinder, adapter.getTypePool().getItemViewBinder(0)); }
@Override @SuppressWarnings("deprecation") protected void onPostCreate(@Nullable Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); adapter = new MultiTypeAdapter(); adapter.register(Category.class, new CategoryViewBinder()); adapter.register(Card.class, new CardViewBinder()); adapter.register(Line.class, new LineViewBinder()); adapter.register(Contributor.class, new ContributorViewBinder(this)); adapter.register(License.class, new LicenseViewBinder()); adapter.register(Recommended.class, new RecommendedViewBinder(this)); items = new Items(); onItemsCreated(items); adapter.setItems(items); adapter.setHasStableIds(true); recyclerView.addItemDecoration(new DividerItemDecoration(adapter)); recyclerView.setAdapter(adapter); initialized = true; }
@Override public void initEvent() { iBookListPresenter = new BookDetailPreImpl(this); mBookInfoResponse = (BookInfoResponse) getIntent().getSerializableExtra(BookInfoResponse.serialVersionName); setTitle(mBookInfoResponse.getTitle()); /**基础信息*/ list.add(mBookInfoResponse); multiTypeAdapter = new MultiTypeAdapter(list); multiTypeAdapter.register(BookInfoResponse.class, new BookInfoBasicsfProvider()); rydetails.setAdapter(multiTypeAdapter); /**简介*/ BookInfoResponse.BookInfoResponseBrief brief = new BookInfoResponse.BookInfoResponseBrief(mBookInfoResponse.getSummary()); list.add(brief); multiTypeAdapter.register(BookInfoResponse.BookInfoResponseBrief.class, new BookInfoBriefProvider()); multiTypeAdapter.notifyDataSetChanged(); loadReviews(mBookInfoResponse.getId(), 0, 5, COMMENT_FIELDS); }
adapter = new MultiTypeAdapter(items); rv.setAdapter(adapter); adapter.register(BookInfoResponse.class, new BookListsProvider()); adapter.applyGlobalMultiTypePool(); // <- 使全局的类型加入到局部中来
@Override public void showData(Object result) { /**评论*/ if (result instanceof BookReviewsListResponse) { if (!((BookReviewsListResponse) result).getReviews().isEmpty()) { list.addAll(((BookReviewsListResponse) result).getReviews()); multiTypeAdapter.register(BookReviewResponse.class, new BookReviewsListResponseItemViewProvider()); multiTypeAdapter.notifyDataSetChanged(); } if (mBookInfoResponse.getSeries() != null) { iBookListPresenter.loadSeries(mBookInfoResponse.getSeries().getId(), 0, 6, SERIES_FIELDS); } } else if (result instanceof BookSeriesListResponse) { /**获取推荐丛书*/ list.add(((BookSeriesListResponse) result)); multiTypeAdapter.register(BookSeriesListResponse.class, new BookSeriesViewProvider()); multiTypeAdapter.notifyDataSetChanged(); } } }
@Test public void shouldReturnOriginalItems() { List list = new ArrayList(); MultiTypeAdapter adapter = new MultiTypeAdapter(list); assertEquals(list, adapter.getItems()); }
@Override public void fetchData() { observable = RxBus.getInstance().register(BaseListFragment.TAG); observable.subscribe(integer -> adapter.notifyDataSetChanged()); }
@Override public void onLoadMore() { if (!onInterceptLoadMore() && !isRequest && page >= PAGEBEGIN) { page++; if(!listResult.contains(loadMore)){ LogUtils.d("onLoadMore:"+page); loadMore.status = LoadMore.STATUS_LOADMORE; listResult.add(loadMore); adapter.setItems(listResult); recyclerView.post(new Runnable() { public void run() { adapter.notifyDataSetChanged(); // adapter.notifyItemInserted(listResult.size() - 1); } }); } request(); } }
public Object getLastVisibleItem() { if (multiTypeAdapter.getItemCount() <= 0) return null; if (lastVisibleItemPosition == RecyclerView.NO_POSITION) return null; if (lastVisibleItemPosition >= multiTypeAdapter.getItemCount()) return null; return multiTypeAdapter.getItems().get(lastVisibleItemPosition); }
public List<?> getData() { return multiTypeAdapter.getItems(); }
@Override protected final void init() { mCurrentPageIndex = getInitPageIndex(); mItems = new ArrayList<>(); mMultiTypeAdapter = getAdapter(); mMultiTypeAdapter.applyGlobalMultiTypePool(); mLoadMoreWrapper = new LoadMoreWrapper(getContext(), mMultiTypeAdapter); mLoadMoreWrapper.setOnLoadListener(new LoadMoreWrapper.OnLoadListener() { @Override public void onRetry() { loadData(mCurrentPageIndex); } @Override public void onLoadMore() { if (isCanLoadMore) AbsListFragment.this.loadMore(); } }); }
@Test public void shouldGetNonNullAdapter() { Exception exception = null; MultiTypeAdapter adapter = new MultiTypeAdapter(); Items empty = new Items(); adapter.setItems(empty); TestItemViewBinder binder = new TestItemViewBinder(); adapter.register(TestItem.class, binder); empty.add(new TestItem("ItemViewBinderTest")); try { binder.notifyTestItemAdded(); } catch (Exception e) { e.printStackTrace(); exception = e; } assertNull(exception); }