package com.digitallizard.bbcnewsreader;
import java.util.ArrayList;
import java.util.Arrays;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.TextView;
public class CategoryChooserAdapter extends BaseAdapter implements ListAdapter {
/* constants */
//FIXME should be in xml
private static final String ENABLED_HEADER_TEXT = "Enabled categories";
private static final String DISABLED_HEADER_TEXT = "Disabled categories";
private static final int VIEW_TYPE_COUNT = 2;
private static final int VIEW_TYPE_HEADER = 0;
private static final int VIEW_TYPE_CATEGORY = 1;
/* variables */
private LayoutInflater inflater;
private ArrayList<String> items;
private int enabledHeaderPosition, disabledHeaderPosition;
public CategoryChooserAdapter(Context context,
String[] enabledCategories, String[] disabledCategories) {
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// build the items list
this.items = new ArrayList<String>();
items.add(ENABLED_HEADER_TEXT);
items.addAll(Arrays.asList(enabledCategories));
items.add(DISABLED_HEADER_TEXT);
items.addAll(Arrays.asList(disabledCategories));
updateHeaderPositions();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// determine if we should be returning a header or an actual item
if(getItemViewType(position) == VIEW_TYPE_HEADER) {
// init a new view if convert view is not of the correct type or is null
if(convertView == null || convertView.getId() != R.id.categoryChooserHeaderItem) {
convertView = inflater.inflate(R.layout.category_chooser_header_item, null);
}
TextView header = (TextView) convertView;
if(position == enabledHeaderPosition) {
// set the enabled header
header.setText(ENABLED_HEADER_TEXT);
}
else if(position == disabledHeaderPosition) {
// set the disabled header
header.setText(DISABLED_HEADER_TEXT);
}
return header;
}
else {
// return an actual item
// init a new view if convert view is not of the correct type or is null
if(convertView == null || convertView.getId() != R.id.categoryChooserSortableItem) {
convertView = inflater.inflate(R.layout.category_chooser_sortable_item, null);
}
// set the item text and return it
((TextView) convertView.findViewById(R.id.categoryChooserItemText)).setText(getItem(position));
return convertView;
}
}
public void move(String item, int from, int to) {
// check that the item is not being moved above the enabled header
if(to <= enabledHeaderPosition) {
to = enabledHeaderPosition + 1;
}
// remove the item and then insert it again
items.remove(item);
items.add(to, item);
// notify the about the change
updateHeaderPositions();
notifyDataSetChanged();
}
@Override
public int getCount() {
return items.size();
}
@Override
public String getItem(int position) {
// return the item at this position
return items.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public int getPosition(String item) {
return items.indexOf(item);
}
@Override
public int getItemViewType(int position) {
// if the item is at 0 or the end of the first list it is a header
if(position == enabledHeaderPosition || position == disabledHeaderPosition) {
return VIEW_TYPE_HEADER;
} else {
// it's a category
return VIEW_TYPE_CATEGORY;
}
}
@Override
public int getViewTypeCount() {
// we have two types of view
return VIEW_TYPE_COUNT;
}
public String[] getEnabledCategories() {
// build an array of enabled categories
ArrayList<String> categories = new ArrayList<String>();
for(int i = (enabledHeaderPosition + 1); i < disabledHeaderPosition; i++) {
categories.add(items.get(i));
}
return categories.toArray(new String[categories.size()]);
}
public String[] getDisabledCategories() {
// build array of disabled categories
ArrayList<String> categories = new ArrayList<String>();
for(int i = (disabledHeaderPosition + 1); i < items.size(); i++) {
categories.add(items.get(i));
}
return categories.toArray(new String[categories.size()]);
}
private void updateHeaderPositions() {
enabledHeaderPosition = 0;
disabledHeaderPosition = items.indexOf(DISABLED_HEADER_TEXT);
}
}