hongyangAndroid / baseAdapter

Android 万能的Adapter for ListView,RecyclerView,GridView等,支持多种Item类型的情况。
Apache License 2.0
4.73k stars 1.2k forks source link

大神看一下, 不支持瀑布流, 只支持LinearManager 和GridLayoutManager , StaggeredGridLayoutManager中支持 #86

Open chenchengyin opened 7 years ago

chenchengyin commented 7 years ago

StaggeredGridLayoutManager 不支持

hgwxr commented 7 years ago

可以加上

@Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); if (isStaggeredGridLayout(holder)) { handleLayoutIfStaggeredGridLayout(holder, holder.getLayoutPosition()); }

}
private boolean isStaggeredGridLayout(RecyclerView.ViewHolder holder) {
    ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
    if (layoutParams != null && layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
        return true;
    }
    return false;
}

protected void handleLayoutIfStaggeredGridLayout(RecyclerView.ViewHolder holder, int position) {
    if (isHeaderView(position) || isFooterView(position)) {
        StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();

        p.setFullSpan(true);
    }
}

我试过可以的

chenchengyin commented 7 years ago

我用的时候滑动列表刷新的时候item会上下移动 你那边会吗

发自网易邮箱 在2017年03月07日 20:06,荒古外星人 写道:

可以加上

@Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); if (isStaggeredGridLayout(holder)) { handleLayoutIfStaggeredGridLayout(holder, holder.getLayoutPosition()); }

} private boolean isStaggeredGridLayout(RecyclerView.ViewHolder holder) { ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); if (layoutParams != null && layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) { return true; } return false; }

protected void handleLayoutIfStaggeredGridLayout(RecyclerView.ViewHolder holder, int position) { if (isHeaderView(position) || isFooterView(position)) { StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();

    p.setFullSpan(true);
}

}

我试过可以的

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

hgwxr commented 7 years ago

我刷新用insertchange。不知道行吗,没有弘扬写的adapter,自己弄得一个

chenchengyin commented 7 years ago

可以发给我看一下吗 谢啦

发自网易邮箱大师 在2017年03月08日 08:38,荒古外星人 写道:

我刷新用insertchange。不知道行吗,没有弘扬写的adapter,自己弄得一个

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

hgwxr commented 7 years ago

e `package com.customview.wl.recyclerview.adapter;

import android.content.Context; import android.support.annotation.LayoutRes; import android.support.v7.widget.GridLayoutManager; 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.AdapterView;

import java.util.ArrayList; import java.util.List;

/**

public abstract class BaseRecyclerAdapter extends RecyclerView.Adapter { protected List mTList; protected Context mContext;

protected  BaseRecyclerAdapter.OnItemClickListener<T> itemClickListener;

public void setItemClickListener(OnItemClickListener<T> itemClickListener) {
    this.itemClickListener = itemClickListener;
}

public BaseRecyclerAdapter(Context mContext) {
    this.mTList = new ArrayList<>();
    this.mContext = mContext;

}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View inflate = LayoutInflater.from(mContext).inflate(viewType, null, false);

    return new BaseViewHolder(inflate);
}

@Override
public void onBindViewHolder(final BaseViewHolder holder, int position) {
    final T data = mTList.get(position);
    bindDataToView(holder, data,position);
    holder.getItemView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            itemClickListener.onClick(v,holder,data);
        }
    });
    holder.getItemView().setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            itemClickListener.onLongClick(v,holder,data);
            return false;
        }
    });
}

protected abstract void bindDataToView(BaseViewHolder holder, T data, int position) ;

public void add(T t,int index){
    mTList.add(index,t);
    notifyItemInserted(index);
}
public  void addAll(List<T>  tList){
     int start=mTList.size()-1;
    mTList.addAll(tList);
    notifyItemRangeInserted(start,mTList.size()-1);
}
@Override
public int getItemCount() {
    return mTList.size();
}

@Override
public int getItemViewType(int position) {
    int TYPE = 0;

    TYPE=getItemType(position);
    return TYPE;
}

protected abstract @LayoutRes int getItemType(int position);

@Override
public long getItemId(int position) {
    return super.getItemId(position);
}

public static class BaseViewHolder extends  RecyclerView.ViewHolder{

    public BaseViewHolder(View itemView) {
        super(itemView);
    }

    public View getItemView(){
        return itemView;
    }
    public  <T extends View> T getView( int id) {
        SparseArray<View> viewHolder = (SparseArray<View>) itemView.getTag();
        if (viewHolder == null) {
            viewHolder = new SparseArray<View>();
            itemView.setTag(viewHolder);
        }
        View childView = viewHolder.get(id);
        if (childView == null) {
            childView = itemView.findViewById(id);
            viewHolder.put(id, childView);
        }
        return (T) childView;
    }

}

public interface OnItemClickListener{ void onClick(View view, BaseViewHolder holder, T data); void onLongClick(View view, BaseViewHolder holder, T data); }

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
    if (manager instanceof GridLayoutManager){
        final GridLayoutManager gridLayoutManager = (GridLayoutManager) manager;
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return getItemSpanSize(position,gridLayoutManager);
            }
        });
        gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount());
    }
}

protected abstract int getItemSpanSize(int position, GridLayoutManager gridLayoutManager);

} ` 还有个我没处理的问题
下面是包装类 ,,仿的 ‘package com.customview.wl.recyclerview.adapter;

import android.support.v4.util.SparseArrayCompat; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import android.view.ViewGroup;

/**

public class HeaderAndFooterWraper extends RecyclerView.Adapter{

 private  SparseArrayCompat<View>  mHeaderViews=new SparseArrayCompat<>();
 private  SparseArrayCompat<View>  mFooterViews=new SparseArrayCompat<>();
 private  RecyclerView.Adapter mInnerAdapter;

private final int  HEADER_ITEM= 10;
private final int  FOOTER_ITEM= 20;
public HeaderAndFooterWraper(RecyclerView.Adapter mInnerAdapter) {
    this.mInnerAdapter = mInnerAdapter;
}

public  void  addFooter(View view){
    mFooterViews.put(getFooterCount()+FOOTER_ITEM,view);
}
public  void  addHeader(View view){
    mHeaderViews.put(getHeaderCount()+HEADER_ITEM,view);
}
private  boolean isHeaderView(int position){
    return   position<getHeaderCount();
}
private  boolean isFooterView(int position){
    return   position>=getHeaderCount()+getRealCount();
}
private int getRealCount() {
    return  mInnerAdapter.getItemCount();
}
public   int  getHeaderCount(){
    return   mHeaderViews.size();
}
public  int getFooterCount(){
  return    mFooterViews.size();
}

@Override
public void onAttachedToRecyclerView(final RecyclerView recyclerView) {
    mInnerAdapter.onAttachedToRecyclerView(recyclerView);
    RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
    if (manager instanceof GridLayoutManager){
        final GridLayoutManager gridLayoutManager = (GridLayoutManager) manager;
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                int itemViewType = getItemViewType(position);
                if (mHeaderViews.get(itemViewType)!=null||mFooterViews.get(itemViewType)!=null){
                    return gridLayoutManager.getSpanCount();
                }
                if (position==9+getHeaderCount()){
                    return gridLayoutManager.getSpanCount();
                }
                return 1;
            }
        });

        //gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount());
    }
    if (manager instanceof     StaggeredGridLayoutManager){

        StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) manager;
        //staggeredGridLayoutManager.setSpanCount(1);
    }

}

@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
    super.onViewAttachedToWindow(holder);
        if (isStaggeredGridLayout(holder)) {
            handleLayoutIfStaggeredGridLayout(holder, holder.getLayoutPosition());
        }

}
private boolean isStaggeredGridLayout(RecyclerView.ViewHolder holder) {
    ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
    if (layoutParams != null && layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
        return true;
    }
    return false;
}

protected void handleLayoutIfStaggeredGridLayout(RecyclerView.ViewHolder holder, int position) {
    if (isHeaderView(position) || isFooterView(position)) {
        StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();

        p.setFullSpan(true);
    }
}
@Override
public int getItemViewType(int position) {
    if (isHeaderView(position)){
        return mHeaderViews.keyAt(position);
    }else if (isFooterView(position)){
        return mFooterViews.keyAt(position - getHeaderCount() - getRealCount());
    }
    return mInnerAdapter.getItemViewType(position-getHeaderCount());
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View header = mHeaderViews.get(viewType);
    if (header !=null){
        BaseRecyclerAdapter.BaseViewHolder viewHolder = new BaseRecyclerAdapter.BaseViewHolder(header);
        return viewHolder;
    }else {
        View footer = mFooterViews.get(viewType);
        if ( footer !=null){
            BaseRecyclerAdapter.BaseViewHolder viewHolder = new BaseRecyclerAdapter.BaseViewHolder(footer);
            return viewHolder;
        }
    }
    return mInnerAdapter.onCreateViewHolder(parent,viewType);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    if (isHeaderView(position)||isFooterView(position)){
        return;
    }
    mInnerAdapter.onBindViewHolder(holder,position-getHeaderCount());
}

@Override
public int getItemCount() {
    return getFooterCount()+getHeaderCount()+getRealCount();
}

} ’