package io.hefuyi.zhihudaily.ui.adapter; import android.content.res.Resources; import android.os.Build; import android.support.v7.widget.RecyclerView; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import io.hefuyi.zhihudaily.R; import io.hefuyi.zhihudaily.interfaces.NavigationDrawerCallbacks; import io.hefuyi.zhihudaily.mvp.model.Theme; import io.hefuyi.zhihudaily.util.L; import io.hefuyi.zhihudaily.util.UIUtils; /** * Created by hefuyi on 16/8/1. */ public class NavigationDrawerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final String TAG = NavigationDrawerAdapter.class.getSimpleName(); private final List<Theme> mThemes; private final boolean mIsKitKatWithNavigation; private int mSelectedPosition = -1; private NavigationDrawerCallbacks mCallbacks; public static final class Type { public static final int TYPE_HEADER = 0; public static final int TYPE_ITEM = 1; public static final int TYPE_BOTTOM_SPACE = 2; } public NavigationDrawerAdapter(boolean isKitKatWithNavigation) { mThemes = new ArrayList<>(); mIsKitKatWithNavigation = isKitKatWithNavigation; } public void setThemes(List<Theme> themes) { mThemes.clear(); mThemes.addAll(themes); notifyDataSetChanged(); } public void setNavigationDrawerCallbacks(NavigationDrawerCallbacks callbacks) { mCallbacks = callbacks; } @Override public int getItemViewType(int position) { if (mIsKitKatWithNavigation) { if (position == 0) { return Type.TYPE_HEADER; } else if (position == mThemes.size() + 2) { return Type.TYPE_BOTTOM_SPACE; } else { return Type.TYPE_ITEM; } } else { return position == 0 ? Type.TYPE_HEADER : Type.TYPE_ITEM; } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView; switch (viewType) { case Type.TYPE_HEADER: itemView = UIUtils.inflate(R.layout.nav_drawer_header, parent); return new HeaderViewHolder(itemView); case Type.TYPE_ITEM: itemView = UIUtils.inflate(R.layout.nav_drawer_item, parent); final ItemViewHolder itemviewHolder = new ItemViewHolder(itemView); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { selectPosition(itemviewHolder.getAdapterPosition()-1); } }); return itemviewHolder; case Type.TYPE_BOTTOM_SPACE: View view = new View(parent.getContext()); view.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, UIUtils.getNavigationBarHeight(parent.getContext()))); UIUtils.setAccessiblityIgnore(view); return new BottomViewHolder(view); } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { int viewType = getItemViewType(position); switch (viewType) { case Type.TYPE_HEADER: HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder; bindHeaderData(headerViewHolder, position); break; case Type.TYPE_ITEM: ItemViewHolder itemViewHolder = (ItemViewHolder) holder; bindItemData(itemViewHolder, position); break; case Type.TYPE_BOTTOM_SPACE: break; default: throw new IllegalArgumentException(TAG + " error view type!"); } } @Override public int getItemCount() { if (mIsKitKatWithNavigation) { return mThemes != null ? mThemes.size() + 3 : 3; } else { return mThemes != null ? mThemes.size() + 2 : 2; } } public void selectPosition(int position) { int realPosition = position + 1; int lastPosition = mSelectedPosition; if (lastPosition != -1 && lastPosition != realPosition) { notifyItemChanged(lastPosition); } if (mSelectedPosition != realPosition) { mSelectedPosition = realPosition; notifyItemChanged(mSelectedPosition); } if (mCallbacks != null) { mCallbacks.onNavigationDrawerItemSelected(position); } } private void bindHeaderData(HeaderViewHolder viewHolder, int position) { } private void bindItemData(ItemViewHolder viewHolder, int position) { Resources resources = viewHolder.itemView.getContext().getResources(); if (position == 1) { viewHolder.ivItemIcon.setVisibility(View.VISIBLE); viewHolder.ivItemIcon.setBackgroundResource(R.drawable.menu_home); viewHolder.tvItemName.setText(resources.getString(R.string.title_activity_main)); } else { viewHolder.ivItemIcon.setBackgroundDrawable(null); viewHolder.ivItemIcon.setVisibility(View.GONE); viewHolder.tvItemName.setText(mThemes.get(position - 2).getName()); } if (mSelectedPosition == position) { L.i(TAG, "selected item = " + position); viewHolder.itemView.setBackgroundColor(resources.getColor(R.color.navigation_item_selected)); viewHolder.tvItemName.setTextColor(resources.getColor(R.color.navdrawer_text_color_selected)); } else if (position!=0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { TypedValue outValue = new TypedValue(); viewHolder.itemView.getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true); viewHolder.itemView.setBackgroundResource(outValue.resourceId); } TypedValue textcolor = new TypedValue(); Resources.Theme theme = viewHolder.itemView.getContext().getTheme(); theme.resolveAttribute(R.attr.navdrawer_text_color, textcolor, true); viewHolder.tvItemName.setTextColor(resources.getColor(textcolor.resourceId)); } } public static class HeaderViewHolder extends RecyclerView.ViewHolder { final ImageView ivHeader; public HeaderViewHolder(View itemView) { super(itemView); ivHeader = (ImageView) itemView.findViewById(R.id.ivHeader); } } public static class ItemViewHolder extends RecyclerView.ViewHolder { final TextView tvItemName; final ImageView ivItemIcon; public ItemViewHolder(View itemView) { super(itemView); tvItemName = (TextView) itemView.findViewById(R.id.tvItemName); ivItemIcon = (ImageView) itemView.findViewById(R.id.ivItemIcon); } } public static class BottomViewHolder extends RecyclerView.ViewHolder { public BottomViewHolder(View itemView) { super(itemView); } } }