package com.lkh.multiadapter;
import android.support.annotation.LayoutRes;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
public abstract class ItemViewAdapter{
public View onCreateView(ViewGroup parent){
return LayoutInflater.from(parent.getContext()).inflate(onGetLayoutId()
, parent, false);
}
public void onCreate(RecyclerViewHolder viewHolder){
}
@LayoutRes
protected abstract int onGetLayoutId();
public abstract void bindData(RecyclerViewHolder viewHolder, E data, int position);
public void bindData(RecyclerViewHolder viewHolder, E data, int position, List
卡片1:
package com.lkh.multiadapter.sample;
import android.widget.TextView;
import com.lkh.multiadapter.ItemViewAdapter;
import com.lkh.multiadapter.R;
import com.lkh.multiadapter.RecyclerViewHolder;
public class SampleoneItemViewAdapter extends ItemViewAdapter {
@Override
protected int onGetLayoutId() {
//布局layout资源id
return R.layout.item_one;
}
@Override
public void bindData(RecyclerViewHolder viewHolder, DataOne data, int position) {
//根据id获取view
TextView tvContent = viewHolder.getView(R.id.tv_content);
//数据绑定
tvContent.setText(data.getContent());
}
}
package com.lkh.multiadapter.sample;
public class DataOne {
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
item_one.xml:
卡片2
package com.lkh.multiadapter.sample;
import android.widget.TextView;
import com.lkh.multiadapter.ItemViewAdapter;
import com.lkh.multiadapter.R;
import com.lkh.multiadapter.RecyclerViewHolder;
public class SampleTwoItemViewAdapter extends ItemViewAdapter {
@Override
protected int onGetLayoutId() {
//布局layout资源id
return R.layout.item_two;
}
@Override
public void bindData(RecyclerViewHolder viewHolder, DataTwo data, int position) {
//根据id获取view
TextView tvNum = viewHolder.getView(R.id.tv_num);
//数据绑定
tvNum.setText("num="+data.getNum());
}
}
package com.lkh.multiadapter.sample;
public class DataTwo {
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
item_two.xml:
总Adapter,继承MultiRecyclerViewAdapter
package com.lkh.multiadapter.sample;
import com.lkh.multiadapter.ItemViewAdapter;
import com.lkh.multiadapter.MultiRecyclerViewAdapter;
public class SampleMultiAdapter extends MultiRecyclerViewAdapter
package com.lkh.multiadapter;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import java.util.List;
public abstract class MultiRecyclerViewAdapter extends RecyclerView.Adapter implements ItemViewAdapterFactory {
public static final int NO_TYPE = -1;
private List dataList;
protected final MapData mMapData = new MapData();
public MultiRecyclerViewAdapter setData(List list) {
this.dataList = list;
return this;
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ItemViewAdapter itemViewModule = onCreateItemViewAdapter(viewType);
RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(itemViewModule.onCreateView(parent), itemViewModule, this, getContextMap());
itemViewModule.onCreate(recyclerViewHolder);
return recyclerViewHolder;
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
if (checkItems(position)) {
return;
}
holder.itemViewAdapter.bindData(holder, dataList.get(position), position);
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position, List payloads) {
if (checkItems(position)) {
return;
}
if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads);
} else {
holder.itemViewAdapter.bindData(holder, dataList.get(position), position, payloads);
}
}
@Override
public int getItemViewType(int position) {
if (checkItems(position)) {
return NO_TYPE;
}
return getViewType(dataList.get(position), position);
}
@Override
public int getItemCount() {
return dataList == null ? 0 : dataList.size();
}
private boolean checkItems(int position) {
return dataList == null || position < 0 || position >= dataList.size();
}
@Override
public MapData getContextMap() {
return mMapData;
}
}
package com.lkh.multiadapter;
public interface ItemViewAdapterFactory {
int getViewType(E data, int position);
ItemViewAdapter extends E> onCreateItemViewAdapter(int viewType);
MapData getContextMap();
}
package com.lkh.multiadapter;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
public final class RecyclerViewHolder extends RecyclerView.ViewHolder {
private final SparseArray views;
ItemViewAdapter itemViewAdapter;
private final RecyclerView.Adapter adapter;
private final MapData mMapData ;
public RecyclerViewHolder(View itemView, ItemViewAdapter itemViewAdapter, RecyclerView.Adapter adapter, MapData mapData) {
super(itemView);
this.views = new SparseArray<>();
this.itemViewAdapter = itemViewAdapter;
this.adapter = adapter;
this.mMapData = mapData;
}
@SuppressWarnings("unchecked")
public T getView(int viewId) {
View view = views.get(viewId);
if (view == null) {
view = itemView.findViewById(viewId);
views.put(viewId, view);
}
return (T) view;
}
public RecyclerView.Adapter getAdapter(){
return adapter;
}
public MapData getContextMap(){
return mMapData;
}
}
package com.lkh.multiadapter;
import android.support.annotation.LayoutRes;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
public abstract class ItemViewAdapter{
public View onCreateView(ViewGroup parent){
return LayoutInflater.from(parent.getContext()).inflate(onGetLayoutId()
, parent, false);
}
public void onCreate(RecyclerViewHolder viewHolder){
}
@LayoutRes
protected abstract int onGetLayoutId();
public abstract void bindData(RecyclerViewHolder viewHolder, E data, int position);
public void bindData(RecyclerViewHolder viewHolder, E data, int position, List payloads){
}
}