package org.aisen.android.ui.fragment.adapter;
import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import org.aisen.android.R;
import org.aisen.android.ui.fragment.APagingFragment;
import org.aisen.android.ui.fragment.itemview.AHeaderItemViewCreator;
import org.aisen.android.ui.fragment.itemview.IITemView;
import org.aisen.android.ui.fragment.itemview.IItemViewCreator;
import java.io.Serializable;
import java.util.ArrayList;
/**
* 1、支持RecycleView
* 2、支持ViewType,默认是Normal Type
*
* Created by wangdan on 16/1/5.
*/
public class BasicRecycleViewAdapter<T extends Serializable> extends RecyclerView.Adapter implements IPagingAdapter {
private IItemViewCreator<T> itemViewCreator;
private ArrayList<T> datas;
private IITemView<T> footerItemView;
private AHeaderItemViewCreator<T> headerItemViewCreator;
private int[][] headerItemTypes;
private AdapterView.OnItemClickListener onItemClickListener;
private AdapterView.OnItemLongClickListener onItemLongClickListener;
private final Activity activity;
private final APagingFragment ownerFragment;
public BasicRecycleViewAdapter(Activity activity, APagingFragment ownerFragment, IItemViewCreator<T> itemViewCreator, ArrayList<T> datas) {
this.activity = activity;
if (datas == null)
datas = new ArrayList<T>();
this.itemViewCreator = itemViewCreator;
this.ownerFragment = ownerFragment;
this.datas = datas;
}
public void addFooterView(IITemView<T> footerItemView) {
this.footerItemView = footerItemView;
if (footerItemView.getConvertView().getLayoutParams() == null) {
footerItemView.getConvertView().setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
}
}
public void setHeaderItemViewCreator(AHeaderItemViewCreator<T> headerItemViewCreator) {
this.headerItemViewCreator = headerItemViewCreator;
headerItemTypes = headerItemViewCreator.setHeaders();
}
@Override
public int getItemViewType(int position) {
if (footerItemView != null && position == getItemCount() - 1) {
return IPagingAdapter.TYPE_FOOTER;
}
else if (headerItemViewCreator != null && position < headerItemTypes.length) {
return headerItemTypes[position][1];
}
int headerCount = headerItemTypes != null ? headerItemTypes.length : 0;
if (position >= headerCount) {
int realPosition = position - headerCount;
T t = getDatas().get(realPosition);
if (t instanceof ItemTypeData) {
return ((ItemTypeData) t).itemType();
}
}
return IPagingAdapter.TYPE_NORMAL;
}
private boolean isHeaderType(int viewType) {
if (headerItemTypes != null) {
for (int[] itemResAndType : headerItemTypes) {
if (viewType == itemResAndType[1]) {
return true;
}
}
}
return false;
}
private boolean isFooterType(int viewType) {
return viewType == IPagingAdapter.TYPE_FOOTER;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View convertView;
IITemView<T> itemView;
if (isFooterType(viewType)) {
itemView = footerItemView;
convertView = itemView.getConvertView();
if (ownerFragment.getRefreshView() != null && ownerFragment.getRefreshView() instanceof RecyclerView) {
RecyclerView recyclerView = (RecyclerView) ownerFragment.getRefreshView();
if (recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager.LayoutParams layoutParams;
if (convertView.getLayoutParams() == null || !(convertView.getLayoutParams() instanceof StaggeredGridLayoutManager.LayoutParams)) {
layoutParams = new StaggeredGridLayoutManager.LayoutParams(StaggeredGridLayoutManager.LayoutParams.MATCH_PARENT, StaggeredGridLayoutManager.LayoutParams.WRAP_CONTENT);
convertView.setLayoutParams(layoutParams);
}
else {
layoutParams = (StaggeredGridLayoutManager.LayoutParams) convertView.getLayoutParams();
}
if (!layoutParams.isFullSpan()) {
layoutParams.setFullSpan(true);
}
}
}
}
else if (isHeaderType(viewType)) {
convertView = headerItemViewCreator.newContentView(activity.getLayoutInflater(), parent, viewType);
itemView = headerItemViewCreator.newItemView(convertView, viewType);
convertView.setTag(R.id.itemview, itemView);
}
else {
convertView = itemViewCreator.newContentView(activity.getLayoutInflater(), parent, viewType);
itemView = itemViewCreator.newItemView(convertView, viewType);
convertView.setTag(R.id.itemview, itemView);
}
itemView.onBindView(convertView);
if (!(itemView instanceof ARecycleViewItemView)) {
throw new RuntimeException("RecycleView只支持ARecycleViewItemView,请重新配置");
}
return (ARecycleViewItemView) itemView;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ARecycleViewItemView itemView = (ARecycleViewItemView) holder;
int headerCount = headerItemTypes != null ? headerItemTypes.length : 0;
if (position >= headerCount) {
int realPosition = position - headerCount;
itemView.reset(datas.size(), realPosition);
if (realPosition < datas.size()) {
itemView.onBindData(itemView.getConvertView(), datas.get(realPosition), realPosition);
}
if (onItemClickListener != null) {
itemView.getConvertView().setOnClickListener(innerOnClickListener);
}
else {
itemView.getConvertView().setOnClickListener(null);
}
if (onItemLongClickListener != null) {
itemView.getConvertView().setOnLongClickListener(innerOnLongClickListener);
}
else {
itemView.getConvertView().setOnLongClickListener(null);
}
}
}
View.OnClickListener innerOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
IITemView<T> itemView = (IITemView<T>) v.getTag(R.id.itemview);
if (onItemClickListener != null && itemView != null) {
onItemClickListener.onItemClick(null, itemView.getConvertView(),
itemView.itemPosition(), getItemId(itemView.itemPosition()));
}
}
};
View.OnLongClickListener innerOnLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
IITemView<T> itemView = (IITemView<T>) v.getTag(R.id.itemview);
if (onItemLongClickListener != null) {
return onItemLongClickListener.onItemLongClick(null, itemView.getConvertView(),
itemView.itemPosition(), getItemId(itemView.itemPosition()));
}
return false;
}
};
@Override
public int getItemCount() {
int footerCount = footerItemView == null ? 0 : 1;
int headerCount = headerItemTypes != null ? headerItemTypes.length : 0;
return datas.size() + footerCount + headerCount;
}
@Override
public ArrayList<T> getDatas() {
return datas;
}
public T getData(int position) {
return datas.get(position);
}
public AdapterView.OnItemClickListener getOnItemClickListener() {
return onItemClickListener;
}
public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public AdapterView.OnItemLongClickListener getOnItemLongClickListener() {
return onItemLongClickListener;
}
public void setOnItemLongClickListener(AdapterView.OnItemLongClickListener onItemLongClickListener) {
this.onItemLongClickListener = onItemLongClickListener;
}
}