/* * Copyright 2016 Jacek Marchwicki <jacek.marchwicki@gmail.com> * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.appunite.rx.android.adapter; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; import com.appunite.detector.ChangesDetector; import com.appunite.detector.SimpleDetector; import java.util.Collections; import java.util.List; import javax.annotation.Nonnull; import rx.functions.Action1; /** * Use: com.jacekmarchwicki.universaladapter.RxUniversalAdapter from https://github.com/jacek-marchwicki/recyclerview-changes-detector * Use: com.jacekmarchwicki.universaladapter.UniversalAdapter from https://github.com/jacek-marchwicki/recyclerview-changes-detector */ @Deprecated public class UniversalAdapter extends RecyclerView.Adapter<ViewHolderManager.BaseViewHolder> implements Action1<List<BaseAdapterItem>>, ChangesDetector.ChangesAdapter { @Nonnull private final ChangesDetector<BaseAdapterItem, BaseAdapterItem> changesDetector = new ChangesDetector<>(new SimpleDetector<BaseAdapterItem>()); @Nonnull private final List<ViewHolderManager> managers; @Nonnull private List<BaseAdapterItem> items = Collections.emptyList(); /** * Usage: * <pre>{@code * public static class Item implements BaseAdapterItem { * * @Nonnull * private final String id; * @Nullable * private final String lastMessage; * * public ChatsItem(@Nonnull String id, * @Nullable String lastMessage) { * this.id = id; * this.lastMessage = lastMessage; * } * * @Override * public boolean matches(@Nonnull BaseAdapterItem item) { * return item instanceof Item && Objects.equal(id, ((Item)item).id); * } * * @Override * public boolean same(@Nonnull BaseAdapterItem item) { * return equals(item); * } * * @Nonnull * public String id() { * return id; * } * * @Nullable * public String lastMessage() { * return lastMessage; * } * * @Override * public boolean equals(Object o) { * if (this == o) return true; * if (!(o instanceof Item)) return false; * final Item chatsItem = (ChatsItem) o; * return Objects.equal(id, chatsItem.id) && * Objects.equal(lastMessage, chatsItem.lastMessage); * } * * @Override * public int hashCode() { * return Objects.hashCode(id, lastMessage); * } * * @Override * public long adapterId() { * return id.hashCode(); * } * } * * private static class MyViewHolderManager implements ViewHolderManager { * @Override * public boolean matches(BaseAdapterItem baseAdapterItem) { * return baseAdapterItem instanceof Item; * } * * @Override * public BaseViewHolder createViewHolder(ViewGroup parent, LayoutInflater from) { * return new Holder(from.inflate(R.layout.activity_chats_item, parent, false)); * } * * public static class Holder extends BaseViewHolder<Item> { * * private final TextView textView; * * public Holder(View itemView) { * super(itemView); * textView = (TextView) itemView; * } * * @Override * public void bind(@Nonnull Item item) { * textView.setText(item.lastMessage()); * } * * } * } * * final UniversalAdapter adapter = new UniversalAdapter( * ImmutableList.<ViewHolderManager>of(new MyViewHolderManager())); * * recyclerView.setAdapter(adapter); * }</pre> * @param managers for inflating views */ public UniversalAdapter(@Nonnull List<ViewHolderManager> managers) { this.managers = managers; } @Override public void call(@Nonnull List<BaseAdapterItem> baseAdapterItems) { items = baseAdapterItems; changesDetector.newData(this, items, false); } @Override public ViewHolderManager.BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final ViewHolderManager manager = managers.get(viewType); return manager.createViewHolder(parent, LayoutInflater.from(parent.getContext())); } @Override public int getItemViewType(int position) { final BaseAdapterItem baseAdapterItem = items.get(position); for (int i = 0; i < managers.size(); i++) { final ViewHolderManager manager = managers.get(i); if (manager.matches(baseAdapterItem)) { return i; } } throw new RuntimeException("Unsupported item type: " + baseAdapterItem); } @Override public void onBindViewHolder(ViewHolderManager.BaseViewHolder holder, int position) { //noinspection unchecked holder.bind(items.get(position)); } @Override public int getItemCount() { return items.size(); } @Override public long getItemId(int position) { return items.get(position).adapterId(); } /** * Return item at position * * Tip: Should not be used in reactive code because it's not a function * Tip: Need to be called from UIThread - because it can change * * @param position of item on the list * @return item at position * @throws IndexOutOfBoundsException if location < 0 || location >= getItemCount() */ @Nonnull public BaseAdapterItem getItemAtPosition(int position) { return items.get(position); } @Override public boolean onFailedToRecycleView(ViewHolderManager.BaseViewHolder holder) { return holder.onFailedToRecycleView(); } @Override public void onViewAttachedToWindow(ViewHolderManager.BaseViewHolder holder) { super.onViewAttachedToWindow(holder); holder.onViewAttachedToWindow(); } @Override public void onViewDetachedFromWindow(ViewHolderManager.BaseViewHolder holder) { super.onViewDetachedFromWindow(holder); holder.onViewDetachedFromWindow(); } @Override public void onViewRecycled(ViewHolderManager.BaseViewHolder holder) { holder.onViewRecycled(); super.onViewRecycled(holder); } }