大佬教程收集整理的这篇文章主要介绍了android – 我正在尝试将标头设置为staggardGridLayoutManeger,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
enter code here public class RecyclerViewHeaderFooterAdapter extends RecyclerView.Adapter { public static final int TYPE_MANAGER_OTHER = 0; public static final int TYPE_MANAGER_LINEAR = 1; public static final int TYPE_MANAGER_GRID = 2; public static final int TYPE_MANAGER_STAGGERED_GRID = 3; public static final int TYPE_HEADER = 7898; public static final int TYPE_FOOTER = 7899; private List<View> mHeaders = new ArrayList<>(); private List<View> mFooters = new ArrayList<>(); privatE int mManagerType; private RecyclerView.LayoutManager mManager; private IRecyclerViewIntermediary mIntermediary; public RecyclerViewHeaderFooterAdapter(RecyclerView.LayoutManager manager,IRecyclerViewIntermediary intermediary){ setManager(manager); this.mIntermediary = intermediary; } public void setLayoutManager(RecyclerView.LayoutManager manager){ setManager(manager); } private void setManager(RecyclerView.LayoutManager manager){ mManager = manager; if(mManager instanceof GridLayoutManager){ mManagerType = TYPE_MANAGER_GRID; ((GridLayoutManager) mManager).setSpanSizeLookup(mSpanSizeLookup); }else if(mManager instanceof linearlayoutmanager){ mManagerType = TYPE_MANAGER_LINEAR; }else if(mManager instanceof StaggeredGridLayoutManager){ mManagerType = TYPE_MANAGER_STAGGERED_GRID; ((StaggeredGridLayoutManager) mManager).setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_betweeN_SPANS); }else{ mManagerType = TYPE_MANAGER_OTHER; } } public int getManagerType(){ return mManagerType; } public int getGridSpan(int position){ if(isHeader(position) || isFooter(position)){ return getSpan(); } position -= mHeaders.size(); if(mIntermediary.getItem(position) instanceof IGridItem){ return ((IGridItem) mIntermediary.getItem(position)).getGridSpan(); } return 1; } privatE int getSpan(){ if(mManager instanceof GridLayoutManager){ return ((GridLayoutManager) mManager).getSpanCount(); }else if(mManager instanceof StaggeredGridLayoutManager){ return ((StaggeredGridLayoutManager) mManager).getSpanCount(); } return 1; } private GridLayoutManager.SpanSizeLookup mSpanSizeLookup = new GridLayoutManager.SpanSizeLookup(){ @Override public int getSpanSize(int position) { return getGridSpan(position); } }; @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup,int typE) { //if our position is one of our items (this comes from getItemViewType(int position) below) if(type != TYPE_HEADER && type != TYPE_FOOTER) { return mIntermediary.getViewHolder(viewGroup,typE); //else we have a header/footer }else{ //create a new framelayout,or inflate from a resource FrameLayout frameLayout = new FrameLayout(viewGroup.getContext()); //make sure it fills the space frameLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT)); return new HeaderFooterViewHolder(frameLayout); } } @Override public void onBindViewHolder(final RecyclerView.ViewHolder vh,int position) { //check what type of view our position is if(isHeader(position)){ View v = mHeaders.get(position); //add our view to a header view and display it prepareHeaderFooter((HeaderFooterViewHolder) vh,v); }else if(isFooter(position)){ View v = mFooters.get(position-mIntermediary.getItemCount()-mHeaders.size()); //add our view to a footer view and display it prepareHeaderFooter((HeaderFooterViewHolder) vh,v); }else { //it's one of our items,display as required mIntermediary.populateViewHolder(vh,position-mHeaders.size()); } } private void prepareHeaderFooter(HeaderFooterViewHolder vh,View view){ //if it's a staggered grid,span the whole layout if(mManagerType == TYPE_MANAGER_STAGGERED_GRID){ StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT); layoutParams.setFullSpan(true); vh.itemView.setLayoutParams(layoutParams); } //if the view already belongs to another layout,remove it if(view.getParent() != null){ ((ViewGroup)view.getParent()).removeView(view); } //empty out our FrameLayout and replace with our header/footer vh.base.removeAllViews(); vh.base.addView(view); } private Boolean isHeader(int position){ return(position < mHeaders.size()); } private Boolean isFooter(int position){ return(position >= mHeaders.size() + mIntermediary.getItemCount()); } @Override public int getItemCount() { return mHeaders.size() + mIntermediary.getItemCount() + mFooters.size(); } @Override public int getItemViewType(int position) { //check what type our position is,based on the assumption that the order is headers > items > footers if(isHeader(position)){ return TYPE_HEADER; }else if(isFooter(position)){ return TYPE_FOOTER; } int type = mIntermediary.getItemViewType(position); if(type == TYPE_HEADER || type == TYPE_FOOTER){ throw new IllegalArgumentexception("Item type cAnnot equal "+TYPE_HEADER+" or "+TYPE_FOOTER); } return type; } //add a header to the adapter public void addHeader(View header){ if(!mHeaders.contains(header)){ mHeaders.add(header); //animate notifyItemInserted(mHeaders.size()-1); } } //remove a header from the adapter public void removeHeader(View header){ if(mHeaders.contains(header)){ //animate notifyItemRemoved(mHeaders.indexOf(header)); mHeaders.remove(header); } } //add a footer to the adapter public void addFooter(View footer){ if(!mFooters.contains(footer)){ mFooters.add(footer); //animate notifyItemInserted(mHeaders.size()+mIntermediary.getItemCount()+mFooters.size()-1); } } //remove a footer from the adapter public void removeFooter(View footer){ if(mFooters.contains(footer)) { //animate notifyItemRemoved(mHeaders.size()+mIntermediary.getItemCount()+mFooters.indexOf(footer)); mFooters.remove(footer); } } //our header/footer RecyclerView.ViewHolder is just a FrameLayout public static class HeaderFooterViewHolder extends RecyclerView.ViewHolder{ FrameLayout base; public HeaderFooterViewHolder(View itemView) { super(itemView); base = (FrameLayout) itemView; } }
}
之后,为了使标题跨越所有列,我在适配器实现中创建了一个新的LayoutParams并将full span设置为true:
@Override public void onBindViewHolder(RecyclerView.ViewHolder holder,int position) { if (holder instanceof CommonItemViewHolder) { ... } else if (holder instanceof HeaderViewHolder) { ... StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT); layoutParams.setFullSpan(true); holder.itemView.setLayoutParams(layoutParams); } }
以上是大佬教程为你收集整理的android – 我正在尝试将标头设置为staggardGridLayoutManeger全部内容,希望文章能够帮你解决android – 我正在尝试将标头设置为staggardGridLayoutManeger所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。