package org.jorge.cmp.ui.adapter; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import org.jorge.cmp.R; import java.util.List; /** * @author poliveira * 24/10/2014 */ public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter .ViewHolder> { private List<NavigationItem> mData; private NavigationDrawerCallbacks mNavigationDrawerCallbacks; private int mSelectedPosition; private int mTouchedPosition = -1; private Context mContext; public NavigationDrawerAdapter(Context context, List<NavigationItem> data) { mContext = context; mData = data; } public void setNavigationDrawerCallbacks(NavigationDrawerCallbacks navigationDrawerCallbacks) { mNavigationDrawerCallbacks = navigationDrawerCallbacks; } @Override public NavigationDrawerAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout .list_item_navigation_drawer, viewGroup, false); return new ViewHolder(v, this); } @Override public void onBindViewHolder(NavigationDrawerAdapter.ViewHolder viewHolder, final int i) { viewHolder.textView.setText(mData.get(i).getText()); viewHolder.textView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); if (mSelectedPosition == i || mTouchedPosition == i) { viewHolder.textView.setTextColor(mContext.getResources().getColor(R.color .navigation_drawer_entry_text_selected)); viewHolder.textView.setCompoundDrawablesWithIntrinsicBounds(mData.get(i) .getSelectedDrawable(), null, null, null); viewHolder.itemView.setBackgroundColor(mContext.getResources().getColor(R.color .navigation_drawer_entry_background_selected)); } else { viewHolder.textView.setTextColor(mContext.getResources().getColor(R.color .navigation_drawer_entry_text_unselected)); viewHolder.textView.setCompoundDrawablesWithIntrinsicBounds(mData.get(i) .getStandardDrawable(), null, null, null); viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT); } } private void touchPosition(int position) { int lastPosition = mTouchedPosition; mTouchedPosition = position; if (lastPosition >= 0) notifyItemChanged(lastPosition); if (position >= 0) notifyItemChanged(position); } public void selectPosition(int position) { int lastPosition = mSelectedPosition; mSelectedPosition = position; notifyItemChanged(lastPosition); notifyItemChanged(position); } @Override public int getItemCount() { return mData != null ? mData.size() : 0; } public int getSelectedPosition() { return mSelectedPosition; } public static class ViewHolder extends RecyclerView.ViewHolder implements View .OnClickListener, View.OnTouchListener { private final NavigationDrawerAdapter mAdapter; public TextView textView; public ViewHolder(View itemView, NavigationDrawerAdapter adapter) { super(itemView); mAdapter = adapter; itemView.setOnClickListener(this); itemView.setOnTouchListener(this); textView = (TextView) itemView.findViewById(android.R.id.text1); } @Override public void onClick(View v) { if (mAdapter.mNavigationDrawerCallbacks != null) mAdapter.mNavigationDrawerCallbacks .onNavigationDrawerItemSelected(getPosition()); } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mAdapter.touchPosition(getPosition()); return Boolean.FALSE; case MotionEvent.ACTION_CANCEL: mAdapter.touchPosition(-1); return Boolean.FALSE; case MotionEvent.ACTION_MOVE: return Boolean.FALSE; case MotionEvent.ACTION_UP: mAdapter.touchPosition(-1); return Boolean.FALSE; } return Boolean.TRUE; } } public static class NavigationItem { private final String mText; private final Drawable mStandardDrawable, mSelectedDrawable; public NavigationItem(String text, Drawable standardDrawable, Drawable selectedDrawable) { mText = text; mStandardDrawable = standardDrawable; mSelectedDrawable = selectedDrawable; } public String getText() { return mText; } public Drawable getStandardDrawable() { return mStandardDrawable; } public Drawable getSelectedDrawable() { return mSelectedDrawable; } } public interface NavigationDrawerCallbacks { void onNavigationDrawerItemSelected(int position); } }