Open chenchengyin opened 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);
}
}
我试过可以的
我用的时候滑动列表刷新的时候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.
我刷新用insertchange。不知道行吗,没有弘扬写的adapter,自己弄得一个
可以发给我看一下吗 谢啦
发自网易邮箱大师 在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.
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
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
@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();
}
} ’
StaggeredGridLayoutManager 不支持