自定義帶頭部和尾部的RecyclerView

//廢話少說直接上代碼


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());
                        }
                    }
            }
        });
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章