//廢話少說直接上代碼
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());
}
}
}
});
}
}