您的位置:首页 > 其它

万能的RecyclerView适配器(可添加头)

2016-05-27 18:07 344 查看
相对来说,RecyclerView 的适配器比ListView的适配器复杂许多,下面封装了一个万能的适配器,使用的时候直接以内部类的形式就行了,非常方便。

代码很简单,就不赘述了!

import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.framework.jcodecraeer.base.listener.OnItemClickListener;
import com.framework.jcodecraeer.base.listener.OnItemLongClickListener;

import java.util.ArrayList;
import java.util.List;

/**
* Created by lzp on 2016/5/27.
*/
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerHolder> {

public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;

protected List<T> itemList = new ArrayList<>();

private View mHeaderView;

private OnItemClickListener mListener;

private OnItemLongClickListener mLongListener;

public void setOnItemClickListener(OnItemClickListener li) {
mListener = li;
}
public void setOnItemLongClickListener(OnItemLongClickListener li){
mLongListener = li;
}

public BaseRecyclerAdapter(){

}

public BaseRecyclerAdapter(List<T> datas){
itemList.addAll(datas);
}

public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(1);
}

public View getHeaderView() {
return mHeaderView;
}

public void addItems(T[] datas){
for (T data : datas){
itemList.add(data);
}
notifyDataSetChanged();
}

public void addItems(List<T> datas) {
itemList.addAll(datas);
notifyDataSetChanged();
}

public void removeItem(int position){
itemList.remove(position);
notifyItemRemoved(position);
}

public void setItems(List<T> datas){
itemList.clear();
itemList.addAll(datas);
notifyDataSetChanged();
}

public void clearItems(){
itemList.clear();
notifyDataSetChanged();
}

public T getItem(int position){
return itemList.get(position);
}

/**
* 判断数据是否为空
*
* @return 为空返回true,不为空返回false
*/
public boolean isEmpty() {
return itemList.isEmpty();
}

@Override
public int getItemViewType(int position) {
if(mHeaderView == null) return TYPE_NORMAL;
if(position == 0) return TYPE_HEADER;
return TYPE_NORMAL;
}

@Override
public RecyclerHolder onCreateViewHolder(ViewGroup parent, final int viewType) {
if(mHeaderView != null && viewType == TYPE_HEADER) return new HeaderHolder(mHeaderView);

View itemView = LayoutInflater.from(parent.getContext()).inflate(itemViewId(), parent, false);
final RecyclerHolder recyclerHolder = new RecyclerHolder(itemView);

if(mListener != null){
recyclerHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(recyclerHolder);
}
});
}

if(mLongListener != null){
recyclerHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mLongListener.onItemLongClick(recyclerHolder);
return true;
}
});
}

return recyclerHolder;
}

@Override
public void onBindViewHolder(final RecyclerHolder viewHolder, int position) {
if(getItemViewType(position) == TYPE_HEADER){
onBindHeader(((HeaderHolder)viewHolder));
return;
}

final int pos = getRealPosition(viewHolder);
final T data = itemList.get(pos);

onBind(viewHolder, pos, data);
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);

RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if(manager instanceof GridLayoutManager) {
final GridLayoutManager gridManager = ((GridLayoutManager) manager);
gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return getItemViewType(position) == TYPE_HEADER
? gridManager.getSpanCount() : 1;
}
});
}
}

@Override
public void onViewAttachedToWindow(RecyclerHolder holder) {
super.onViewAttachedToWindow(holder);
ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
if(lp != null
&& lp instanceof StaggeredGridLayoutManager.LayoutParams) {
StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
p.setFullSpan(holder.getLayoutPosition() == 0);
}
}

public int getRealPosition(RecyclerHolder holder) {
int position = holder.getLayoutPosition();
return mHeaderView == null ? position : position -1;
}

@Override
public int getItemCount() {
return mHeaderView == null ? itemList.size() : itemList.size()+1;
}

public abstract int itemViewId();
public void onBindHeader(HeaderHolder viewHolder){

}
public abstract void onBind(RecyclerHolder viewHolder, int RealPosition, T data);

public class HeaderHolder extends RecyclerHolder {
public HeaderHolder(View itemView) {
super(itemView);
}
}

}


再附上一分ViewHolder

/**
* Created by lzp on 2016/5/27.
*/
public class RecyclerHolder extends RecyclerView.ViewHolder {

/**
* 用于存储当前item当中的View
*/
private SparseArray<View> mViews;

public RecyclerHolder(View itemView) {
super(itemView);
mViews = new SparseArray<>();
}

public <T extends View> T findView(int ViewId) {
View view = mViews.get(ViewId);
//集合中没有,则从item当中获取,并存入集合当中
if (view == null) {
view = itemView.findViewById(ViewId);
mViews.put(ViewId, view);
}
return (T) view;
}

/**
* 根据id得到TextView
*
* @return
*/
public TextView getTextView(int viewId) {
return findView(viewId);
}

/**
* 根据id得到ImageView
*
* @return
*/
public ImageView getImageView(int viewId) {
return findView(viewId);
}

/**
* 根据id得到Button
*
* @return
*/
public Button getButton(int viewId) {
return findView(viewId);
}

/**
* 根据id得到RadioButton
*
* @return
*/
public RadioButton getRadioButton(int viewId) {
return findView(viewId);
}

/**
* 根据id得到CheckBox
*
* @return
*/
public CheckBox getCheckBox(int viewId) {
return findView(viewId);
}

/**
* 根据id得到ImageButton
*
* @return
*/
public ImageButton getImageButton(int viewId) {
return findView(viewId);
}

/**
* 根据id得到ImageButton
*
* @return
*/
public EditText getEditText(int viewId) {
return findView(viewId);
}

/**
* 根据id设置View的隐藏和显示
*
* @param viewId
* @param visibility
*/
public void setVisibility(int viewId, int visibility) {
findView(viewId).setVisibility(visibility);
}

/**
* 根据id设置View的点击事件
*
* @param viewId
* @param l
*/
public void setOnClickListener(int viewId, View.OnClickListener l) {
findView(viewId).setOnClickListener(l);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: