recyclerView万能适配器和多条目万能适配器,添加头和脚

//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);
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值