package com.door43.translationstudio.newui.translate; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.door43.translationstudio.R; import com.door43.widget.ViewUtil; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeSet; /** * Created by joel on 9/15/2015. */ public class ChooseSourceTranslationAdapter extends BaseAdapter { public static final int TYPE_ITEM = 0; public static final int TYPE_SEPARATOR = 1; private final Context mContext; private Map<String, ViewItem> mData = new HashMap<>(); private List<String> mSelected = new ArrayList<>(); private List<String> mAvailable = new ArrayList<>(); private List<ViewItem> mSortedData = new ArrayList<>(); private TreeSet<Integer> mSectionHeader = new TreeSet<>(); public ChooseSourceTranslationAdapter(Context context) { mContext = context; } @Override public int getCount() { return mSortedData.size(); } /** * Adds an item to the list * If the item id matches an existing item it will be skipped * @param item */ public void addItem(final ViewItem item) { if(!mData.containsKey(item.id)) { mData.put(item.id, item); if(item.selected) { mSelected.add(item.id); } else { mAvailable.add(item.id); } } } @Override public ViewItem getItem(int position) { return mSortedData.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { return mSectionHeader.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM; } @Override public int getViewTypeCount() { return 2; } /** * Resorts the data */ public void sort() { mSortedData = new ArrayList<>(); mSectionHeader = new TreeSet<>(); // build list ViewItem selectedHeader = new ChooseSourceTranslationAdapter.ViewItem(mContext.getResources().getString(R.string.selected), null, false); mSortedData.add(selectedHeader); mSectionHeader.add(mSortedData.size() - 1); for(String id:mSelected) { mSortedData.add(mData.get(id)); } ViewItem availableHeader = new ChooseSourceTranslationAdapter.ViewItem(mContext.getResources().getString(R.string.available), null, false); mSortedData.add(availableHeader); mSectionHeader.add(mSortedData.size() - 1); for(String id:mAvailable) { mSortedData.add(mData.get(id)); } notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder = null; int rowType = getItemViewType(position); if(convertView == null) { switch (rowType) { case TYPE_SEPARATOR: v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_select_source_translation_list_header, null); holder = new ViewHolder(); holder.titleView = (TextView)v; break; case TYPE_ITEM: v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_select_source_translation_list_item, null); holder = new ViewHolder(); holder.titleView = (TextView)v.findViewById(R.id.title); holder.checkboxView = (ImageView) v.findViewById(R.id.checkBoxView); break; } v.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.titleView.setText(getItem(position).title); if(rowType == TYPE_ITEM) { if (getItem(position).selected) { holder.checkboxView.setBackgroundResource(R.drawable.ic_check_box_black_24dp); ViewUtil.tintViewDrawable(holder.checkboxView, parent.getContext().getResources().getColor(R.color.accent)); // display checked } else { holder.checkboxView.setBackgroundResource(R.drawable.ic_check_box_outline_blank_black_24dp); ViewUtil.tintViewDrawable(holder.checkboxView, parent.getContext().getResources().getColor(R.color.dark_primary_text)); // display unchecked } } return v; } public void select(int position) { ViewItem item = getItem(position); item.selected = true; mSelected.remove(item.id); mAvailable.remove(item.id); mSelected.add(item.id); } public void deselect(int position) { ViewItem item = getItem(position); item.selected = false; mSelected.remove(item.id); mAvailable.remove(item.id); mAvailable.add(item.id); } public static class ViewHolder { public TextView titleView; public ImageView checkboxView; } public static class ViewItem { public final String title; public final String id; public Boolean selected; public ViewItem(String title, String id, Boolean selected) { this.title = title; this.id = id; this.selected = selected; } } }