package com.gh4a.adapter; import android.content.Context; import android.database.Cursor; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.gh4a.R; import com.gh4a.db.BookmarksProvider.Columns; import com.gh4a.utils.StringUtils; import com.gh4a.utils.UiUtils; public class BookmarkAdapter extends RecyclerView.Adapter<BookmarkAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener { public interface OnItemClickListener { void onItemClick(long id, String url); void onItemLongClick(long id); } private final OnItemClickListener mItemClickListener; private final int mRepoIconResId; private final int mUserIconResId; private final LayoutInflater mInflater; private Cursor mCursor; private int mIdColumnIndex; private int mTypeColumnIndex; private int mNameColumnIndex; private int mExtraColumnIndex; private int mUrlColumnIndex; public BookmarkAdapter(Context context, OnItemClickListener listener) { super(); setHasStableIds(true); mInflater = LayoutInflater.from(context); mRepoIconResId = UiUtils.resolveDrawable(context, R.attr.repoBookmarkIcon); mUserIconResId = UiUtils.resolveDrawable(context, R.attr.userBookmarkIcon); mItemClickListener = listener; } public void swapCursor(Cursor cursor) { if (cursor == mCursor) { return; } if (mCursor != null) { mCursor.close(); } mCursor = cursor; if (mCursor != null) { mIdColumnIndex = cursor.getColumnIndexOrThrow(Columns._ID); mTypeColumnIndex = cursor.getColumnIndexOrThrow(Columns.TYPE); mNameColumnIndex = cursor.getColumnIndexOrThrow(Columns.NAME); mExtraColumnIndex = cursor.getColumnIndexOrThrow(Columns.EXTRA); mUrlColumnIndex = cursor.getColumnIndexOrThrow(Columns.URI); } notifyDataSetChanged(); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.row_bookmark, parent, false); ViewHolder vh = new ViewHolder(view); if (mItemClickListener != null) { view.setOnClickListener(this); view.setOnLongClickListener(this); view.setTag(vh); } return vh; } @Override public void onBindViewHolder(ViewHolder holder, int position) { if (!mCursor.moveToPosition(position)) { return; } int type = mCursor.getInt(mTypeColumnIndex); String name = mCursor.getString(mNameColumnIndex); String extraData = mCursor.getString(mExtraColumnIndex); switch (type) { case Columns.TYPE_REPO: holder.mIcon.setImageResource(mRepoIconResId); break; case Columns.TYPE_USER: holder.mIcon.setImageResource(mUserIconResId); break; default: holder.mIcon.setImageDrawable(null); break; } holder.mTitle.setText(name); if (StringUtils.isBlank(extraData)) { holder.mExtra.setVisibility(View.GONE); } else { holder.mExtra.setText(extraData); holder.mExtra.setVisibility(View.VISIBLE); } } @Override public int getItemCount() { return mCursor != null ? mCursor.getCount() : 0; } @Override public long getItemId(int position) { return mCursor.moveToPosition(position) ? mCursor.getLong(mIdColumnIndex) : -1; } @Override public void onClick(View view) { ViewHolder vh = (ViewHolder) view.getTag(); int position = vh.getAdapterPosition(); if (position != RecyclerView.NO_POSITION && mCursor.moveToPosition(position)) { mItemClickListener.onItemClick(mCursor.getLong(mIdColumnIndex), mCursor.getString(mUrlColumnIndex)); } } @Override public boolean onLongClick(View view) { ViewHolder vh = (ViewHolder) view.getTag(); int position = vh.getAdapterPosition(); if (position != RecyclerView.NO_POSITION && mCursor.moveToPosition(position)) { mItemClickListener.onItemLongClick(mCursor.getLong(mIdColumnIndex)); return true; } return false; } static class ViewHolder extends RecyclerView.ViewHolder { private ImageView mIcon; private TextView mTitle; private TextView mExtra; public ViewHolder(View view) { super(view); mIcon = (ImageView) view.findViewById(R.id.iv_icon); mTitle = (TextView) view.findViewById(R.id.tv_title); mExtra = (TextView) view.findViewById(R.id.tv_extra); } } }