package com.ghostflying.portalwaitinglist.recyclerviewHelper; 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.LinearLayout; import android.widget.TextView; import com.ghostflying.portalwaitinglist.R; import com.ghostflying.portalwaitinglist.model.PortalDetail; import com.ghostflying.portalwaitinglist.model.PortalEvent; import com.ghostflying.portalwaitinglist.util.SettingUtil; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * Created by ghostflying on 11/22/14. * <br> * Adapter for RecyclerView */ public class PortalListAdapter extends RecyclerView.Adapter<PortalListAdapter.ViewHolder>{ public List<PortalDetail> dataSet; DateFormat localeDateFormat; Date dateNow; View.OnClickListener onClickListener; public PortalListAdapter (List<PortalDetail> dataSet){ this.dataSet = dataSet; localeDateFormat = DateFormat.getDateInstance(DateFormat.FULL); dateNow = new Date(); } public void setDataSet(List<PortalDetail> data){ dataSet = data; notifyDataSetChanged(); } /** * Create item view for each item. * @param viewGroup the view group * @param i item's position in recyclerview. * @return new ViewHolder defined by inner class. */ @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.portal_list_item, viewGroup, false); if (onClickListener != null) v.setOnClickListener(onClickListener); return new ViewHolder(v); } /** * Set the callback of clock event. * @param onClickListener the callback. */ public void setOnItemClickListener(View.OnClickListener onClickListener){ this.onClickListener = onClickListener; } /** * Set item view's value by the dataset. * @param viewHolder the view holder for each item view. * @param position the position of data in dataset. */ @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { // get data. PortalDetail detail = dataSet.get(position); viewHolder.portalName.setText(detail.getName()); viewHolder.portalLastUpdated.setText(getDateDiffStr(detail.getLastUpdated())); // set the event list List<PortalEvent> events = detail.getEvents(); viewHolder.setEventCount(events.size()); for (int i = 0; i < events.size(); i++){ viewHolder.setEventIcon(i, getEventIcon(events.get(i).getOperationType(), events.get(i).getOperationResult())); viewHolder.setEventDate(i, localeDateFormat.format(events.get(i).getDate())); } // set the status icon in title if (SettingUtil.getShowStatusInList()){ viewHolder.portalStatus.setImageResource( getStatusIcon(events.get(events.size() - 1).getOperationResult()) ); viewHolder.portalStatus.setVisibility(View.VISIBLE); } else { viewHolder.portalStatus.setVisibility(View.GONE); } } private String getDateDiffStr(Date date){ long diff = dateNow.getTime() - date.getTime(); int dayDiff = Math.round(diff / 1000 / 3600 / 24); return Integer.toString(dayDiff); } /** * Get the icon drawable resource id by operation type and result. * @param operationType the operation type. * @param operationResult the operation result. * @return the resource id. */ private int getEventIcon(PortalEvent.OperationType operationType, PortalEvent.OperationResult operationResult){ switch (operationResult){ case ACCEPTED: return R.drawable.ic_accepted; case REJECTED: return R.drawable.ic_rejected; case DUPLICATE: return R.drawable.ic_rejected; case PROPOSED: switch (operationType){ case EDIT: return R.drawable.ic_edit; case SUBMISSION: return R.drawable.ic_proposed; case INVALID: return R.drawable.ic_edit; } default: return R.drawable.ic_proposed; } } /** * Get the icon drawable resource id by operation result. The method only return accepted, * rejected or waiting icon. * @param operationResult the operation result. * @return the resource id. */ private int getStatusIcon(PortalEvent.OperationResult operationResult){ switch (operationResult){ case ACCEPTED: return R.drawable.ic_accepted; case REJECTED: return R.drawable.ic_rejected; case DUPLICATE: return R.drawable.ic_rejected; case PROPOSED: return R.drawable.ic_waiting; default: return R.drawable.ic_waiting; } } @Override public int getItemCount() { return dataSet.size(); } /** * The class to hold each item view, offer interface to adjust item view. */ public static class ViewHolder extends RecyclerView.ViewHolder{ private static final int INITIAL_EVENT_NUMBER = 1; public TextView portalName; public TextView portalLastUpdated; public ImageView portalStatus; public LinearLayout portalEventList; public ArrayList<View> portalEventItems; public ViewHolder(View itemView) { super(itemView); portalName = (TextView)itemView.findViewById(R.id.portal_name); portalLastUpdated = (TextView)itemView.findViewById(R.id.portal_last_updated); portalStatus = (ImageView)itemView.findViewById(R.id.portal_status_in_list); portalEventList = (LinearLayout)itemView.findViewById(R.id.portal_event_list); portalEventItems = new ArrayList<View>(); addEventView(INITIAL_EVENT_NUMBER); } private void addEventView(int number){ for (int i = 0; i < number; i++){ View eventView = LayoutInflater.from(portalEventList.getContext()) .inflate(R.layout.portal_event_list_item, portalEventList, false); portalEventItems.add(eventView); portalEventList.addView(eventView); } } public void setEventCount(int totalCount){ //add all needed view if (portalEventItems.size() < totalCount){ addEventView(totalCount - portalEventItems.size()); } //set all views' visible for (int i = 0; i < portalEventItems.size(); i++){ if (i < totalCount) portalEventItems.get(i).setVisibility(View.VISIBLE); else portalEventItems.get(i).setVisibility(View.GONE); } } public void setEventIcon(int index, int drawableId){ ((ImageView)portalEventItems.get(index).findViewById(R.id.event_type_image)).setImageResource(drawableId); } public void setEventDate(int index, String dateStr){ ((TextView)portalEventItems.get(index).findViewById(R.id.event_date_text)).setText(dateStr); } } }