自定义带头部和尾部的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
- 自定义带头部和尾部的RecyclerView
- recyclerview 添加头部和尾部的优雅
- RecyclerView添加头部和尾部
- RecyclerView添加头部和尾部
- RecyclerView 添加头部和尾部布局
- Android RecyclerView添加头部和尾部
- RecyclerView 添加头部和尾部布局
- RecyclerView 添加头部和尾部布局
- 为RecyclerView添加头部和尾部
- Android RecyclerView添加头部和尾部
- Android 给RecyclerView添加头部和尾部
- RecyclerView添加头部尾部
- RecyclerView 添加头部和尾部,并实现Item的点击事件
- 给RecyclerView添加头部和尾部最简单的实现方式
- RecyclerView 添加头部和尾部,并实现Item的点击事件
- (4.1.45.1)RecyclerView 添加头部和尾部布局 一
- RecyclerView学习(1) 添加头部和尾部
- RecyclerView添加头部和尾部并解决no
- 计算机图形学01——坐标系
- mybatis3--5.映射配置文件
- VS2010环境下 用MySQL Connector C 连接 MySql数据库
- JavaScript笔记(1)
- 做好正确的选择,明确奋斗的目标
- 自定义带头部和尾部的RecyclerView
- 递归函数解析
- MySql面试前必须练习到熟练的
- P1529 回家 Bessie Come Home(字符串+flored)+特判
- springmvc 和 cxf整合
- linux内核系列(2)——linux内核链表
- sass编译过程中出现编码错误的问题
- 3-GMM-HMMs语音识别系统-解码篇
- hdu 6016