package com.aspsine.swipetoloadlayout.demo.adapter; import android.content.res.Resources; import android.support.v4.view.ViewPager; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.aspsine.swipetoloadlayout.demo.R; import com.aspsine.swipetoloadlayout.demo.fragment.TwitterRecyclerFragment; import com.aspsine.swipetoloadlayout.demo.model.Character; import com.aspsine.swipetoloadlayout.demo.model.Section; import com.squareup.picasso.CircleTransformation; import com.squareup.picasso.Picasso; import java.util.ArrayList; import java.util.List; /** * Created by Aspsine on 2015/9/9. */ public class RecyclerCharactersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final int TYPE_VIEWPAGER = 0; private static final int TYPE_GROUP = 1; private static final int TYPE_CHILD = 2; private final List<Character> mHeroes; private final List<Section> mSections; private final List<Integer> mGroupPositions; private LoopViewPagerAdapter mPagerAdapter; protected OnGroupItemClickListener mOnGroupItemClickListener; protected OnGroupItemLongClickListener mOnGroupItemLongClickListener; protected OnChildItemClickListener mOnChildItemClickListener; protected OnChildItemLongClickListener mOnChildItemLongClickListener; private final int mType; public RecyclerCharactersAdapter(int type) { mType = type; mHeroes = new ArrayList<>(); mSections = new ArrayList<>(); mGroupPositions = new ArrayList<>(); } public void setList(List<Character> heroes, List<Section> sections) { mHeroes.clear(); mSections.clear(); mHeroes.addAll(heroes); append(sections); } public void append(List<Section> sections) { mSections.addAll(sections); notifyDataSetChanged(); initGroupPositions(); } public void initGroupPositions() { mGroupPositions.clear(); int groupPosition = 0; for (int i = 0; i < getGroupCount(); i++) { if (i == 0) { groupPosition = 0; } else { groupPosition += getChildCount(i - 1) + 1; } mGroupPositions.add(groupPosition + 1); } } @Override public int getItemViewType(int position) { if (position == 0) { return TYPE_VIEWPAGER; } else if (mGroupPositions.contains(position)) { return TYPE_GROUP; } else { return TYPE_CHILD; } } @Override public int getItemCount() { int count = mHeroes.size() == 0 ? 0 : 1; for (int i = 0; i < getGroupCount(); i++) { count += getChildCount(i); } return count + getGroupCount(); } public int getChildCount(int groupPosition) { List<Character> characters = mSections.get(groupPosition).getCharacters(); return characters != null ? characters.size() : 0; } public int getGroupCount() { return mSections.size(); } @Override public void onAttachedToRecyclerView(final RecyclerView recyclerView) { RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager; gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { RecyclerView.Adapter adapter = recyclerView.getAdapter(); if (isFullSpanType(adapter.getItemViewType(position))) { return gridLayoutManager.getSpanCount(); } return 1; } }); } } @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); int position = holder.getLayoutPosition(); int type = getItemViewType(position); if (isFullSpanType(type)) { ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) { StaggeredGridLayoutManager.LayoutParams lp = (StaggeredGridLayoutManager.LayoutParams) layoutParams; lp.setFullSpan(true); } } } private boolean isFullSpanType(int type) { return type == TYPE_VIEWPAGER || type == TYPE_GROUP; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { int type = getItemViewType(i); View itemView = null; switch (type) { case TYPE_VIEWPAGER: itemView = inflate(viewGroup, R.layout.layout_viewpager); return new ViewPagerHolder(itemView); case TYPE_GROUP: itemView = inflate(viewGroup, R.layout.item_header); return new GroupHolder(itemView); case TYPE_CHILD: if (mType == TwitterRecyclerFragment.TYPE_LINEAR) { itemView = inflate(viewGroup, R.layout.item_hero); } else { itemView = inflate(viewGroup, R.layout.item_hero_grid); } final ChildHolder holder = new ChildHolder(itemView); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int absolutePosition = holder.getAdapterPosition(); int groupPosition = getGroupPosition(absolutePosition); int childPosition = getChildPosition(absolutePosition); Character character = mSections.get(groupPosition).getCharacters().get(childPosition); Toast.makeText(view.getContext(), character.getName(), Toast.LENGTH_SHORT).show(); } }); return holder; } throw new IllegalArgumentException("Wrong type!"); } private View inflate(ViewGroup parent, int layoutRes) { return LayoutInflater.from(parent.getContext()).inflate(layoutRes, parent, false); } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { int type = getItemViewType(i); switch (type) { case TYPE_VIEWPAGER: onBindViewPagerHolder((ViewPagerHolder) viewHolder); break; case TYPE_GROUP: onBindGroupHolder((GroupHolder) viewHolder, getGroupPosition(i)); break; case TYPE_CHILD: onBindChildHolder((ChildHolder) viewHolder, getGroupPosition(i), getChildPosition(i)); break; } } private void onBindViewPagerHolder(ViewPagerHolder holder) { if (holder.viewPager.getAdapter() == null) { mPagerAdapter = new LoopViewPagerAdapter(holder.viewPager, holder.indicators); holder.viewPager.setAdapter(mPagerAdapter); holder.viewPager.addOnPageChangeListener(mPagerAdapter); holder.viewPager.setBackgroundDrawable(holder.itemView.getResources().getDrawable(R.mipmap.bg_viewpager)); mPagerAdapter.setList(mHeroes); } else { mPagerAdapter.setList(mHeroes); } } private void onBindGroupHolder(GroupHolder holder, int parentPosition) { holder.tvGroup.setText(mSections.get(parentPosition).getName()); } private void onBindChildHolder(ChildHolder holder, int parentPosition, int childPosition) { Character character = mSections.get(parentPosition).getCharacters().get(childPosition); holder.tvName.setText(character.getName()); Resources resources = holder.itemView.getResources(); int size = resources.getDimensionPixelOffset(R.dimen.hero_avatar_size); int width = resources.getDimensionPixelOffset(R.dimen.hero_avatar_border); Picasso.with(holder.itemView.getContext()) .load(character.getAvatar()) .resize(size, size) .transform(new CircleTransformation(width)) .into(holder.ivAvatar); } int getGroupPosition(int position) { int groupPosition = 1; for (int i = mGroupPositions.size() - 1; i >= 0; i--) { if (position >= mGroupPositions.get(i)) { groupPosition = i; break; } } return groupPosition; } int getChildPosition(int position) { int groupPosition = getGroupPosition(position); int absGroupPosition = mGroupPositions.get(groupPosition); int childPositionInGroup = position - absGroupPosition - 1; return childPositionInGroup; } public void start() { if (mPagerAdapter != null) { mPagerAdapter.start(); } } public void stop() { if (mPagerAdapter != null) { mPagerAdapter.stop(); } } static class ViewPagerHolder extends RecyclerView.ViewHolder { ViewPager viewPager; ViewGroup indicators; public ViewPagerHolder(View itemView) { super(itemView); viewPager = (ViewPager) itemView.findViewById(R.id.viewPager); indicators = (ViewGroup) itemView.findViewById(R.id.indicators); } } static class GroupHolder extends RecyclerView.ViewHolder { TextView tvGroup; public GroupHolder(View itemView) { super(itemView); tvGroup = (TextView) itemView.findViewById(R.id.tvHeader); } } static class ChildHolder extends RecyclerView.ViewHolder { ImageView ivAvatar; TextView tvName; public ChildHolder(View itemView) { super(itemView); tvName = (TextView) itemView.findViewById(R.id.tvName); ivAvatar = (ImageView) itemView.findViewById(R.id.ivAvatar); } } }