package com.moez.QKSMS.ui.base; import android.database.Cursor; import android.support.v7.widget.RecyclerView; import android.view.View; import com.moez.QKSMS.common.utils.CursorUtils; import java.util.HashMap; public abstract class RecyclerCursorAdapter<VH extends RecyclerView.ViewHolder, DataType> extends RecyclerView.Adapter<VH> { public interface ItemClickListener<DataType> { void onItemClick(DataType object, View view); void onItemLongClick(DataType object, View view); } public interface MultiSelectListener { void onMultiSelectStateChanged(boolean enabled); void onItemAdded(long id); void onItemRemoved(long id); } protected QKActivity mContext; protected Cursor mCursor; public RecyclerCursorAdapter(QKActivity context) { mContext = context; } protected HashMap<Long, DataType> mSelectedItems = new HashMap<>(); protected ItemClickListener<DataType> mItemClickListener; protected RecyclerCursorAdapter.MultiSelectListener mMultiSelectListener; public void setItemClickListener(ItemClickListener<DataType> conversationClickListener) { mItemClickListener = conversationClickListener; } public void setMultiSelectListener(RecyclerCursorAdapter.MultiSelectListener multiSelectListener) { mMultiSelectListener = multiSelectListener; } public void changeCursor(Cursor cursor) { Cursor old = swapCursor(cursor); if (old != null) { old.close(); } } private Cursor swapCursor(Cursor cursor) { if (mCursor == cursor) { return null; } Cursor oldCursor = mCursor; mCursor = cursor; if (cursor != null) { notifyDataSetChanged(); } return oldCursor; } public Cursor getCursor() { return mCursor; } public int getCount() { return mCursor == null ? 0 : mCursor.getCount(); } protected abstract DataType getItem(int position); public boolean isInMultiSelectMode() { return mSelectedItems.size() > 0; } public HashMap<Long, DataType> getSelectedItems() { return mSelectedItems; } public void disableMultiSelectMode(boolean requestCallback) { if (isInMultiSelectMode()) { mSelectedItems.clear(); notifyDataSetChanged(); if (requestCallback && mMultiSelectListener != null) { mMultiSelectListener.onMultiSelectStateChanged(false); } } } public boolean isSelected(long threadId) { return mSelectedItems.containsKey(threadId); } public void setSelected(long threadId, DataType object) { if (!mSelectedItems.containsKey(threadId)) { mSelectedItems.put(threadId, object); notifyDataSetChanged(); if (mMultiSelectListener != null) { mMultiSelectListener.onItemAdded(threadId); if (mSelectedItems.size() == 1) { mMultiSelectListener.onMultiSelectStateChanged(true); } } } } public void setUnselected(long threadId) { if (mSelectedItems.containsKey(threadId)) { mSelectedItems.remove(threadId); notifyDataSetChanged(); if (mMultiSelectListener != null) { mMultiSelectListener.onItemRemoved(threadId); if (mSelectedItems.size() == 0) { mMultiSelectListener.onMultiSelectStateChanged(false); } } } } public void toggleSelection(long threadId, DataType object) { if (isSelected(threadId)) { setUnselected(threadId); } else { setSelected(threadId, object); } } @Override public int getItemCount() { return CursorUtils.isValid(mCursor) ? mCursor.getCount() : 0; } }