自定义带头部和尾部的RecyclerView

来源:互联网 发布:淘宝赚佣金的软件 编辑:程序博客网 时间:2024/05/02 00:33
//废话少说直接上代码
import android.content.Context;import android.support.annotation.Nullable;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.AttributeSet;import android.util.Log;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.ArrayList;/** * Created by 红超 on 2017/4/23. */public class SupRecyclerView extends RecyclerView {    public SupRecyclerView(Context context) {        super(context);          }    ArrayList<View> headViewList=new ArrayList<>();    ArrayList<View> FooterViewList =new ArrayList<>();    public void addHeadView(View view){        headViewList.add(view);    }    public void addFooterView (View view){        FooterViewList.add(view);    }    public void removeHeadView(View view){        headViewList.remove(view);        getAdapter().notifyDataSetChanged();    }    public  void removeFooterView(View view){        FooterViewList.remove(view);        getAdapter().notifyDataSetChanged();    }      public SupRecyclerView(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);      }    public SupRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);     }    @Override    public void setAdapter(Adapter adapter) {        adapter=new supAdapter(adapter);        super.setAdapter(adapter);    }    class supAdapter extends  RecyclerView.Adapter<ViewHolder>{        Adapter adapter ;        supAdapter(Adapter adapter){            this.adapter=adapter;        }        @Override        public int getItemCount() {            return FooterViewList.size()+headViewList.size()+adapter.getItemCount();        }        @Override        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            if (viewType>=200){
//viewType=position+200
//index=viewtype-200-adapter.getItemCount-headViewList.size()                return new ViewHolder(FooterViewList.get(viewType - 200-adapter.getItemCount()-headViewList.size())){                };            } if (viewType<=-100){                Log.e(TAG, "onCreateViewHolder: "+-(viewType+100));
//viewType=-100-position     index==position=-(viewType+100)                return new ViewHolder(headViewList.get(-(viewType+100))) {                };            }            return adapter.onCreateViewHolder(parent,viewType);        }        @Override        public void onBindViewHolder(ViewHolder holder, int position) {            if (position>=headViewList.size()&&position<adapter.getItemCount()+headViewList.size()){                adapter.onBindViewHolder(holder,position-headViewList.size());            }        }        @Override        public int getItemViewType(int position) {            if (position<headViewList.size()){                //小于头部                Log.e(TAG, "getItemViewType: "+position+headViewList.size());                return -100-position;            }//当position==headViewList.size()的时候是指第一个非头view
else if (position>=headViewList.size()&&position<headViewList.size()+adapter.getItemCount()){                //中间的                return adapter.getItemViewType(position-headViewList.size());            }else {                return 200+position;            }        }    }    @Override    public void setLayoutManager(LayoutManager layout) {        updateSpanLook();        super.setLayoutManager(layout);    }    GestureDetector gestureDetector =new GestureDetector(getContext(),new gestureListener());    public class gestureListener extends GestureDetector.SimpleOnGestureListener{        @Override        public boolean onSingleTapUp(MotionEvent e) {            float x = e.getX();            float y = e.getY();
    //通过xy拿到顶级视图itemView            View itemView = findChildViewUnder(x, y);           if (itemView!=null) {
       //通过顶级视图找到当前的viewHolder               ViewHolder viewHolder = findContainingViewHolder(itemView);//找到当前点击的位置的position               int adapterPosition = viewHolder.getAdapterPosition();
//添加点击事假               Log.e(TAG, "onSingleTapUp: " + adapterPosition);           }            return true;        }    }    private static final String TAG = "SupRecyclerView";    @Override    public boolean onTouchEvent(MotionEvent e) {        gestureDetector.onTouchEvent(e);        return super.onTouchEvent(e);    }    class MyWrapLookUp extends GridLayoutManager.SpanSizeLookup {        @Override        public int getSpanSize(int position) {            int itemViewType = getAdapter().getItemViewType(position);            GridLayoutManager layoutManager = (GridLayoutManager) getLayoutManager();            if (itemViewType <= -100 || itemViewType >= 200) {                //如果是非头非尾的返回指定的列数
    return layoutManager.getSpanCount();            }
    //如果不是中间的返回1 独占全屏            GridLayoutManager.SpanSizeLookup spanSizeLookup = layoutManager.getSpanSizeLookup();            return 1;        }    }    private void updateSpanLook() {        post(new Runnable() {            @Override            public void run() {                LayoutManager layout = getLayoutManager();                if (layout != null)                    if (layout instanceof GridLayoutManager) {                        Adapter adapter = getAdapter();                        if (adapter != null && adapter instanceof supAdapter) {                            ((GridLayoutManager) layout).setSpanSizeLookup(new MyWrapLookUp());                        }                    }            }        });    }}
1 0
原创粉丝点击