package com.boardgamegeek.ui.adapter; import android.content.Context; import android.content.Intent; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.TextView; import com.boardgamegeek.R; import com.boardgamegeek.model.Forum; import com.boardgamegeek.ui.ForumActivity; import com.boardgamegeek.ui.widget.TimestampView; import com.boardgamegeek.util.ActivityUtils; import java.text.NumberFormat; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; public class ForumsRecyclerViewAdapter extends RecyclerView.Adapter<ForumsRecyclerViewAdapter.ForumViewHolder> { public static final int ITEM_VIEW_TYPE_FORUM = 0; public static final int ITEM_VIEW_TYPE_HEADER = 1; private final List<Forum> forums; private final LayoutInflater inflater; private final int gameId; private final String gameName; private final NumberFormat numberFormat; public ForumsRecyclerViewAdapter(Context context, List<Forum> forums, int gameId, String gameName) { this.forums = forums; this.gameId = gameId; this.gameName = gameName; inflater = LayoutInflater.from(context); setHasStableIds(true); numberFormat = NumberFormat.getNumberInstance(); } @Override public ForumViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case ITEM_VIEW_TYPE_HEADER: return new HeaderViewHolder(inflater.inflate(R.layout.row_header, parent, false)); case ITEM_VIEW_TYPE_FORUM: return new ForumItemViewHolder(inflater.inflate(R.layout.row_forum, parent, false)); } return null; } @Override public void onBindViewHolder(ForumViewHolder holder, int position) { switch (holder.getItemViewType()) { case ITEM_VIEW_TYPE_HEADER: ((HeaderViewHolder) holder).bind(forums.get(position)); break; case ITEM_VIEW_TYPE_FORUM: ((ForumItemViewHolder) holder).bind(forums.get(position)); break; } } @Override public int getItemCount() { return forums == null ? 0 : forums.size(); } @Override public int getItemViewType(int position) { try { Forum forum = forums.get(position); if (forum != null && forum.isHeader()) { return ITEM_VIEW_TYPE_HEADER; } return ITEM_VIEW_TYPE_FORUM; } catch (ArrayIndexOutOfBoundsException e) { return ITEM_VIEW_TYPE_FORUM; } } @Override public long getItemId(int position) { return position; } public class ForumViewHolder extends RecyclerView.ViewHolder { public ForumViewHolder(View itemView) { super(itemView); } } public class ForumItemViewHolder extends ForumViewHolder { @BindView(R.id.forum_title) TextView forumTitleView; @BindView(R.id.number_of_threads) TextView numberOfThreadsView; @BindView(R.id.last_post_date) TimestampView lastPostDateView; public ForumItemViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } public void bind(final Forum forum) { if (forum == null) return; final Context context = itemView.getContext(); forumTitleView.setText(forum.title); numberOfThreadsView.setText(numberFormat.format(forum.numberOfThreads)); lastPostDateView.setTimestamp(forum.lastPostDate()); itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, ForumActivity.class); intent.putExtra(ActivityUtils.KEY_FORUM_ID, forum.id); intent.putExtra(ActivityUtils.KEY_FORUM_TITLE, forum.title); intent.putExtra(ActivityUtils.KEY_GAME_ID, gameId); intent.putExtra(ActivityUtils.KEY_GAME_NAME, gameName); context.startActivity(intent); } }); } } public class HeaderViewHolder extends ForumViewHolder { @BindView(android.R.id.title) TextView header; public HeaderViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } public void bind(Forum forum) { if (forum != null) { header.setText(forum.title); } } } }