package jp.gr.procon.proconapp.ui.adapter; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.TextView; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import jp.gr.procon.proconapp.R; import jp.gr.procon.proconapp.model.PlayerCheckedItem; import timber.log.Timber; public class NoticeSettingAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final int VIEW_TYPE_HEADER = 1; private static final int VIEW_TYPE_ITEM = 2; public interface OnChangeCheckListener { void onChangeCheck(PlayerCheckedItem item); } private ArrayList<PlayerCheckedItem> mItems; private boolean mIsClickable; private OnChangeCheckListener mOnChangeCheckListener; public NoticeSettingAdapter(ArrayList<PlayerCheckedItem> items) { mItems = items; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case VIEW_TYPE_HEADER: return HeaderViewHolder.create(parent); default: return ItemViewHolder.create(parent); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { case VIEW_TYPE_HEADER: ((HeaderViewHolder) holder).bindTo(); break; case VIEW_TYPE_ITEM: ((ItemViewHolder) holder).bindTo(mItems.get(position - getHeadersCount()), mIsClickable, mOnChangeCheckListener); break; } } @Override public int getItemViewType(int position) { if (position < getHeadersCount()) { return VIEW_TYPE_HEADER; } else { return VIEW_TYPE_ITEM; } } @Override public int getItemCount() { return mItems.size() + getHeadersCount(); } public int getHeadersCount() { return 1; } public void setCheckWithIds(ArrayList<Long> ids, boolean isCheck) { ArrayList<PlayerCheckedItem> checkedItems = new ArrayList<>(mItems); Collections.sort(checkedItems, new Comparator<PlayerCheckedItem>() { @Override public int compare(PlayerCheckedItem lhs, PlayerCheckedItem rhs) { return lhs.getPlayer().getId().compareTo(rhs.getPlayer().getId()); } }); for (long id : ids) { int index = Collections.binarySearch(checkedItems, id); if (index >= 0) { PlayerCheckedItem item = checkedItems.get(index); item.setIsCheck(isCheck); Timber.d("setCheckWithIds: " + item.getPlayer().getId()); } } } /** * @return 選択状態がONになっているアイテムのリスト */ public ArrayList<PlayerCheckedItem> getCheckedItemList() { ArrayList<PlayerCheckedItem> checkedItems = new ArrayList<>(); for (PlayerCheckedItem item : mItems) { if (item.isCheck()) { checkedItems.add(item); } } return checkedItems; } public void setClickable(boolean isClickable) { mIsClickable = isClickable; } public void setOnChangeCheckListener(OnChangeCheckListener onChangeCheckListener) { mOnChangeCheckListener = onChangeCheckListener; } private static class HeaderViewHolder extends RecyclerView.ViewHolder { private static final int RES_ID = R.layout.text_description; private TextView mTextView; public static HeaderViewHolder create(ViewGroup parent) { return new HeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(RES_ID, parent, false)); } public HeaderViewHolder(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.text_body); } public void bindTo() { mTextView.setText(R.string.desc_notification_setting); } } private static class ItemViewHolder extends RecyclerView.ViewHolder { private static final int RES_ID = R.layout.item_checked_player; private TextView mNameText; private CheckBox mCheckBox; private static ItemViewHolder create(ViewGroup parent) { return new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(RES_ID, parent, false)); } public ItemViewHolder(View itemView) { super(itemView); mNameText = (TextView) itemView.findViewById(R.id.name_text); mCheckBox = (CheckBox) itemView.findViewById(R.id.check_box); } public void bindTo(final PlayerCheckedItem item, boolean isClickable, final OnChangeCheckListener listener) { mNameText.setText(item.getPlayer().getName()); mCheckBox.setChecked(item.isCheck()); if (isClickable) { itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { item.toggleCheck(); if (listener != null) { listener.onChangeCheck(item); } } }); } else { itemView.setOnClickListener(null); } } } }