//xml1
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv1"
android:text="123"
android:gravity="center_horizontal"
/>
</LinearLayout>
xml2
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv2"
android:text="123"
android:gravity="center_horizontal"
/>
//activity的xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="a1501b.bawei.com.recyclerviewcommomadpter.MainActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/b1"
android:text="正常"
/>
<Button
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/b2"
android:text="多条目"
/>
<Button
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/b3"
android:text="添加头尾布局"
/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recyclerView"
></android.support.v7.widget.RecyclerView>
</LinearLayout>
</LinearLayout>
//万能适配器的viewholder
package a1501b.bawei.com.recyclerviewcommomadpter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.TextView;
/**
* 1.类的用途
* 2.@author:Sunyubo
* 3.@ 2017/2/12.
*/
public class CommonViewHolder extends RecyclerView.ViewHolder{
/**
* 上下文
*/
private final Context mContext;
/**
* 使用集合来存储item上的控件
*/
private SparseArray<View> mViewList;
/**
* 加载item的布局
*/
private View mConvertView;
private CommonViewHolder(Context context, View itemView) {
super(itemView);
this.mContext = context;
this.mConvertView = itemView;
mViewList = new SparseArray<View>();
}
/**
*
* 获取ViewHolder的方法
*
* @param context 上下文
* @param layoutID 布局ID
* @param parent 父控件
* @return 返回当前的布局ID所对应的ViewHolder的实例
*/
public static CommonViewHolder getViewHolder(Context context, int layoutID, ViewGroup parent){
//将布局ID转化为视图
View itemView = LayoutInflater.from(context).inflate(layoutID,parent,false);
//实例化当前ViewHolder
CommonViewHolder viewHolder = new CommonViewHolder(context, itemView);
//返回
return viewHolder;
}
/**
*
* 通过ID取控件的方法 对ItemView的重用已经进行了缓存
*
* @param viewID 控件的ID
* @return 返回id所对应的控件
*/
public <T extends View>T getView(int viewID){
//从集合中取控件
View view = mViewList.get(viewID);
//如果没有就通过findViewById创建一个,并缓存到集合中
if(view == null){
view = mConvertView.findViewById(viewID);
mViewList.put(viewID,view);
}
return (T) view;
}
public TextView getTextView(int viewId){
TextView textView=getView(viewId);
return textView;
}
public CommonViewHolder setText(int viewId,String s){
TextView textView=getView(viewId);
textView.setText(s);
return this;
}
public CommonViewHolder setimageResouse(int viewID,int resID){
ImageView imageView = getView(viewID);
imageView.setImageResource(resID);
return this;
}
public CommonViewHolder setBackgroundColor(int viewId, int color)
{
View view = getView(viewId);
view.setBackgroundColor(color);
return this;
}
public CommonViewHolder setBackgroundRes(int viewId, int backgroundRes)
{
View view = getView(viewId);
view.setBackgroundResource(backgroundRes);
return this;
}
public CommonViewHolder setTextColor(int viewId, int textColor)
{
TextView view = getView(viewId);
view.setTextColor(textColor);
return this;
}
public CommonViewHolder setTextColorRes(int viewId, int textColorRes)
{
TextView view = getView(viewId);
view.setTextColor(mContext.getResources().getColor(textColorRes));
return this;
}
public CommonViewHolder setOnClickLisenter(int viewID,View.OnClickListener listener){
View view = getView(viewID);
view.setOnClickListener(listener);
return this;
}
public CommonViewHolder setVisible(int viewId, boolean visible)
{
View view = getView(viewId);
view.setVisibility(visible ? View.VISIBLE : View.GONE);
return this;
}
public CommonViewHolder setChecked(int viewId, boolean checked)
{
Checkable view = (Checkable) getView(viewId);
view.setChecked(checked);
return this;
}
}
//万能的适配器
package a1501b.bawei.com.recyclerviewcommomadpter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
/**
* 1.类的用途
* 2.@author:Sunyubo
* 3.@ 2017/2/12.
*/
public abstract class RecyclerViewCommonAdpter<T> extends RecyclerView.Adapter<CommonViewHolder>{
//上下文
Context context;
//布局的id
int layoutId;
//数据的集合,因为我们不知道是什么数据,所以用泛型T
protected List<T> list;
//万能适配器所关联的viewholder
CommonViewHolder commonViewHolder;
public RecyclerViewCommonAdpter(Context context, int layoutId, List<T> list) {
this.context = context;
this.layoutId = layoutId;
this.list = list;
}
@Override
public CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
commonViewHolder=CommonViewHolder.getViewHolder(context,layoutId,parent);
return commonViewHolder;
}
@Override
public void onBindViewHolder(CommonViewHolder holder, final int position) {
//我们不知道怎么赋值,所以写一个抽象方法
conver(holder,list.get(position));
if(onItemClickListener!=null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.setOnItemClickListener(position);
}
});
}
}
public abstract void conver(CommonViewHolder holder, T t);
@Override
public int getItemCount() {
return list.size();
}
OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener=onItemClickListener;
}
interface OnItemClickListener{
void setOnItemClickListener(int position);
}
}
//多条目的类型
package a1501b.bawei.com.recyclerviewcommomadpter;
/**
* 1.类的用途
* 2.@author:Sunyubo
* 3.@ 2017/2/12.
*/
public interface CountsItemSupport<T> {
int getLayoutId(int itemType);
int getItemViewType(int position,T t);
}
//多条目的万能适配器
package a1501b.bawei.com.recyclerviewcommomadpter;
import android.content.Context;
import android.view.ViewGroup;
import java.util.List;
/**
* 1.类的用途
* 2.@author:Sunyubo
* 3.@ 2017/2/12.
*/
public abstract class CountsItemsCommonAdpter<T> extends RecyclerViewCommonAdpter<T> {
CountsItemSupport countsItemSupport;
public CountsItemsCommonAdpter(Context context, List<T> list,CountsItemSupport countsItemSupport) {
super(context, -1, list);
this.countsItemSupport=countsItemSupport;
}
@Override
public int getItemViewType(int position) {
return countsItemSupport.getItemViewType(position,list.get(position));
}
@Override
public CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
int layoutId=countsItemSupport.getLayoutId(viewType);
CommonViewHolder commonViewHolder=CommonViewHolder.getViewHolder(context,layoutId,parent);
return commonViewHolder;
}
}
//main的activity
package a1501b.bawei.com.recyclerviewcommomadpter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private ArrayList<String> mList = new ArrayList<String>();
private RecyclerView mRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
findViewById(R.id.b1).setOnClickListener(this);
findViewById(R.id.b2).setOnClickListener(this);
findViewById(R.id.b3).setOnClickListener(this);
for(int i = 0 ; i < 100 ; i++){
mList.add("第"+(i+1)+"条数据");
}
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.b1:
normal();
break;
case R.id.b2:
countsItem();
break;
case R.id.b3:
addHeadAndFoot();
break;
}
}
private void addHeadAndFoot() {
}
private final int TYPE_1 = 1;
private final int TYPE_2 = 2;
private void countsItem() {
/* CountsItemsCommonAdpter<String> countsItemsCommonAdpter=new CountsItemsCommonAdpter<String>(MainActivity.this, mList, new CountsItemSupport<String>() {
@Override
public int getLayoutId(int itemType) {
if(itemType==1){
return R.layout.item1;
}
if(itemType==2){
return R.layout.item2;
}
return 0;
}
@Override
public int getItemViewType(int position, String o) {
if(position%3==0){
return 1;
}else{
return 2;
}
}
}) {
@Override
public void conver(CommonViewHolder holder, String s) {
if(type == 1){
holder.setText(R.id.tv1,s);
}else{
holder.setText(R.id.tv2,s+" -- > 我是一个多条目数据");
}
}
};*/
mRecyclerView.setAdapter(new CountsItemsCommonAdpter<String>(MainActivity.this, mList, new CountsItemSupport<String>() {
@Override
public int getLayoutId(int itemType) {
if(itemType == TYPE_1){
return R.layout.item1;
}
return R.layout.item2;
}
@Override
public int getItemViewType(int position, String s) {
if(position%2 == 0){
return TYPE_1;
}
return TYPE_2;
}
}) {
@Override
public void conver(CommonViewHolder holder, String s) {
int type = holder.getItemViewType();
if(type == TYPE_1){
holder.setText(R.id.tv1,s);
}else{
holder.setText(R.id.tv2,s+" -- > 我是一个多条目数据");
}
}
});
}
private void normal() {
RecyclerViewCommonAdpter<String> recyclerViewCommonAdpter=new RecyclerViewCommonAdpter<String>(MainActivity.this,R.layout.item1,mList) {
@Override
public void conver(CommonViewHolder holder, String s) {
holder.setText(R.id.tv1,s);
}
};
mRecyclerView.setAdapter(recyclerViewCommonAdpter);
recyclerViewCommonAdpter.setOnItemClickListener(new RecyclerViewCommonAdpter.OnItemClickListener() {
@Override
public void setOnItemClickListener(int position) {
Toast.makeText(MainActivity.this, mList.get(position),Toast.LENGTH_SHORT).show();
}
});
}
}
//添加头和脚
package com.jiangpeng.allpowerfuladapter;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by 姜鹏 on 2017/1/9.
*
* 装饰着模式实现 RecyclerView 添加头布局/尾部局支持的类
*/
public class HeaderAndFooterSupport extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
/**
* 记录被增强之前的Adapter
*/
private final RecyclerView.Adapter mAdapter;
/**
* 记录头布局View的集合
*/
private SparseArray<View> mHeaders = new SparseArray<>();
/**
* 记录尾部局View的集合
*/
private SparseArray<View> mFooters = new SparseArray<>();
/**
* 头布局的标记
*/
private static final int HEADER_TYPE_ITEM = 10000;
/**
* 尾部局的标记
*/
private static final int FOOTER_TYPE_ITEM = 20000;
/**
* 添加头布局的方法
*/
public void addHeaderView(View view){
mHeaders.put(mHeaders.size()+HEADER_TYPE_ITEM,view);
}
/**
* 添加尾部局的方法
*/
public void addFooterView(View view){
mFooters.put(mFooters.size()+FOOTER_TYPE_ITEM,view);
}
/**
* 是否是头布局
* @param position 当前position/需要判断的position
* @return
*/
public boolean isHederViewPos(int position){
return position < getHeadersCount();
}
/**
* 是否是尾布局
* @param position 当前position/需要判断的position
* @return
*/
public boolean isFooterViewPos(int position){
return position >= getHeadersCount() + getRealCount();
}
/**
* 返回头布局的数量
* @return
*/
public int getHeadersCount(){
return mHeaders.size();
}
/**
* 返回尾部局的数量
* @return
*/
public int getFootersCount(){
return mFooters.size();
}
/**
* 返回未添加头/尾布局之前的Item数量
* @return
*/
public int getRealCount(){
return mAdapter.getItemCount();
}
/**
* 构造方法 需要传入将要被增强的Adapter
* @param adapter
*/
public HeaderAndFooterSupport(RecyclerView.Adapter adapter) {
this.mAdapter = adapter;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//如果当前的条目类型是头布局类型 就将此头布局View取出构建一个单独的ViewHolder并返回
if(mHeaders.get(viewType) != null){
ViewHolder viewHolder = ViewHolder.createViewHolder(parent.getContext(),mHeaders.get(viewType));
return viewHolder;
}
if(mFooters.get(viewType) != null){
ViewHolder viewHolder = ViewHolder.createViewHolder(parent.getContext(),mFooters.get(viewType));
return viewHolder;
}
return mAdapter.createViewHolder(parent,viewType);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
/**
* 如果是头布局或者尾布局不用处理直接返回
*/
if(isHederViewPos(position)){
return;
}
if(isFooterViewPos(position)){
return;
}
mAdapter.onBindViewHolder(holder,position - getHeadersCount());
}
/**
* 添加头尾布局的核心方法
* 因为RecyclerView的头/尾布局都可以被看做是一个Item,只是他们分别在RecyclerView的头部与尾部,我们视同多条目加载的思想实现
* 首先判断当前的position下的item是否是头布局/尾部局 如果是 就将当前position下的Key(相对应的头布局集合/尾部局集合)作为ItemType返回
*/
@Override
public int getItemViewType(int position) {
if(isHederViewPos(position)){
return mHeaders.keyAt(position);
}
if(isFooterViewPos(position)){
return mFooters.keyAt(position - getHeadersCount() - getRealCount());
}
return mAdapter.getItemViewType(position - getHeadersCount());
}
@Override
public int getItemCount() {
return mAdapter.getItemCount() + mHeaders.size() + mFooters.size();
}
/**
* 处理GridlayoutManager下的头/尾布局
* 因为我们的处理方式 是使用的多条目加载 所以GridLayoutManager下 他们只会作为一个Item处理
* 我们需要将头布局/尾部局沾满我们所设置的"跨度"
* 思路:
* 通过 GridLayoutManager的setSpanSizeLookUp方法为Item设置所占用的"跨度"
* 判断 如果是头/尾布局的Item 就将当前的Item的跨度设置为全部的"跨度"
*/
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if(layoutManager instanceof GridLayoutManager){
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int type = getItemViewType(position);
if(mHeaders.get(type) != null){
return gridLayoutManager.getSpanCount();
}
if(mFooters.get(type) != null){
return gridLayoutManager.getSpanCount();
}
return 1;
}
});
}
}
/**
* 瀑布流下 同理
*/
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
int position = holder.getLayoutPosition();
if(isHederViewPos(position) || isFooterViewPos(position)){
ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
if(layoutParams != null &&
layoutParams instanceof StaggeredGridLayoutManager.LayoutParams){
StaggeredGridLayoutManager.LayoutParams p =
(StaggeredGridLayoutManager.LayoutParams) layoutParams;
p.setFullSpan(true);
}
}
}
}
recyclerView万能适配器和多条目万能适配器,添加头和脚
最新推荐文章于 2023-03-23 15:54:04 发布