package it.slyce.messaging.message.messageItem; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.List; import it.slyce.messaging.R; import it.slyce.messaging.message.messageItem.externalUser.media.MessageExternalUserMediaViewHolder; import it.slyce.messaging.message.messageItem.externalUser.text.MessageExternalUserTextViewHolder; import it.slyce.messaging.message.messageItem.general.generalOptions.MessageGeneralOptionsViewHolder; import it.slyce.messaging.message.messageItem.internalUser.media.MessageInternalUserViewHolder; import it.slyce.messaging.message.messageItem.internalUser.text.MessageInternalUserTextViewHolder; import it.slyce.messaging.message.messageItem.general.generalText.MessageGeneralTextViewHolder; import it.slyce.messaging.message.messageItem.spinner.SpinnerViewHolder; import it.slyce.messaging.utils.CustomSettings; /** * Created by John C. Hunchar on 5/12/16. */ public class MessageRecyclerAdapter extends RecyclerView.Adapter<MessageViewHolder> { private static final String TAG = MessageRecyclerAdapter.class.getName(); private List<MessageItem> mMessageItems; private CustomSettings customSettings; public MessageRecyclerAdapter(List<MessageItem> messageItems, CustomSettings customSettings) { mMessageItems = messageItems; this.customSettings = customSettings; } @Override public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); MessageViewHolder viewHolder = null; MessageItemType messageItemType = MessageItemType.values()[viewType]; switch (messageItemType) { case INCOMING_MEDIA: View scoutMediaView = inflater.inflate(R.layout.item_message_external_media, parent, false); viewHolder = new MessageExternalUserMediaViewHolder(scoutMediaView, customSettings); break; case INCOMING_TEXT: View scoutTextView = inflater.inflate(R.layout.item_message_external_text, parent, false); viewHolder = new MessageExternalUserTextViewHolder(scoutTextView, customSettings); break; case OUTGOING_MEDIA: View userMediaView = inflater.inflate(R.layout.item_message_user_media, parent, false); viewHolder = new MessageInternalUserViewHolder(userMediaView, customSettings); break; case OUTGOING_TEXT: View userTextView = inflater.inflate(R.layout.item_message_user_text, parent, false); viewHolder = new MessageInternalUserTextViewHolder(userTextView, customSettings); break; case SPINNER: View spinnerView = inflater.inflate(R.layout.item_spinner, parent, false); viewHolder = new SpinnerViewHolder(spinnerView, customSettings); break; case GENERAL_TEXT: View generalTextView = inflater.inflate(R.layout.item_message_general_text, parent, false); viewHolder = new MessageGeneralTextViewHolder(generalTextView, customSettings); break; case GENERAL_OPTIONS: View generalOptionsView = inflater.inflate(R.layout.item_message_general_options, parent, false); viewHolder = new MessageGeneralOptionsViewHolder(generalOptionsView, customSettings); break; } return viewHolder; } @Override public void onBindViewHolder(MessageViewHolder messageViewHolder, int position) { if (messageViewHolder == null) { return; } // Build the item MessageItem messageItem = getMessageItemByPosition(position); if (messageItem != null) { messageItem.buildMessageItem(messageViewHolder); } } @Override public int getItemCount() { return mMessageItems != null ? mMessageItems.size() : 0; } @Override public int getItemViewType(int position) { // Get the item type Integer itemType = getMessageItemType(position); if (itemType != null) { return itemType; } return super.getItemViewType(position); } private MessageItem getMessageItemByPosition(int position) { if (mMessageItems != null && !mMessageItems.isEmpty()) { if (position >= 0 && position < mMessageItems.size()) { MessageItem messageItem = mMessageItems.get(position); if (messageItem != null) { return messageItem; } } } return null; } private Integer getMessageItemType(int position) { MessageItem messageItem = getMessageItemByPosition(position); if (messageItem != null) { return messageItem.getMessageItemTypeOrdinal(); } return null; } public void updateMessageItemDataList(List<MessageItem> messageItems) { mMessageItems = messageItems; notifyDataSetChanged(); } }