Blame client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/utils/SeparatedListAdapter.java

Packit 1fb8d4
/*
Packit 1fb8d4
   Separated List Adapter
Packit 1fb8d4
   Taken from http://jsharkey.org/blog/2008/08/18/separating-lists-with-headers-in-android-09/
Packit 1fb8d4
Packit 1fb8d4
   Copyright Jeff Sharkey
Packit 1fb8d4
Packit Service 5a9772
   This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
Packit Service 5a9772
   If a copy of the MPL was not distributed with this file, You can obtain one at
Packit Service 5a9772
   http://mozilla.org/MPL/2.0/.
Packit 1fb8d4
*/
Packit 1fb8d4
Packit 1fb8d4
package com.freerdp.freerdpcore.utils;
Packit 1fb8d4
Packit 1fb8d4
import android.content.Context;
Packit 1fb8d4
import android.view.View;
Packit 1fb8d4
import android.view.ViewGroup;
Packit 1fb8d4
import android.widget.Adapter;
Packit 1fb8d4
import android.widget.ArrayAdapter;
Packit 1fb8d4
import android.widget.BaseAdapter;
Packit 1fb8d4
Packit 1fb8d4
import com.freerdp.freerdpcore.R;
Packit 1fb8d4
Packit 1fb8d4
import java.util.LinkedHashMap;
Packit 1fb8d4
import java.util.Map;
Packit 1fb8d4
Packit Service 5a9772
public class SeparatedListAdapter extends BaseAdapter
Packit Service 5a9772
{
Packit Service 5a9772
Packit Service 5a9772
	public final static int TYPE_SECTION_HEADER = 0;
Packit Service 5a9772
	public final Map<String, Adapter> sections = new LinkedHashMap<String, Adapter>();
Packit Service 5a9772
	public final ArrayAdapter<String> headers;
Packit Service 5a9772
Packit Service 5a9772
	public SeparatedListAdapter(Context context)
Packit Service 5a9772
	{
Packit Service 5a9772
		headers = new ArrayAdapter<String>(context, R.layout.list_header);
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	public void addSection(String section, Adapter adapter)
Packit Service 5a9772
	{
Packit Service 5a9772
		this.headers.add(section);
Packit Service 5a9772
		this.sections.put(section, adapter);
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	public void setSectionTitle(int section, String title)
Packit Service 5a9772
	{
Packit Service 5a9772
		String oldTitle = this.headers.getItem(section);
Packit Service 5a9772
Packit Service 5a9772
		// remove/add to headers array
Packit Service 5a9772
		this.headers.remove(oldTitle);
Packit Service 5a9772
		this.headers.insert(title, section);
Packit Service 5a9772
Packit Service 5a9772
		// remove/add to section map
Packit Service 5a9772
		Adapter adapter = this.sections.get(oldTitle);
Packit Service 5a9772
		this.sections.remove(oldTitle);
Packit Service 5a9772
		this.sections.put(title, adapter);
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	public Object getItem(int position)
Packit Service 5a9772
	{
Packit Service 5a9772
		for (int i = 0; i < headers.getCount(); i++)
Packit Service 5a9772
		{
Packit Service 5a9772
			String section = headers.getItem(i);
Packit Service 5a9772
			Adapter adapter = sections.get(section);
Packit Service 5a9772
Packit Service 5a9772
			// ignore empty sections
Packit Service 5a9772
			if (adapter.getCount() > 0)
Packit Service 5a9772
			{
Packit Service 5a9772
				int size = adapter.getCount() + 1;
Packit Service 5a9772
Packit Service 5a9772
				// check if position inside this section
Packit Service 5a9772
				if (position == 0)
Packit Service 5a9772
					return section;
Packit Service 5a9772
				if (position < size)
Packit Service 5a9772
					return adapter.getItem(position - 1);
Packit Service 5a9772
Packit Service 5a9772
				// otherwise jump into next section
Packit Service 5a9772
				position -= size;
Packit Service 5a9772
			}
Packit Service 5a9772
		}
Packit Service 5a9772
		return null;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	public int getCount()
Packit Service 5a9772
	{
Packit Service 5a9772
		// total together all sections, plus one for each section header (except if the section is
Packit Service 5a9772
		// empty)
Packit Service 5a9772
		int total = 0;
Packit Service 5a9772
		for (Adapter adapter : this.sections.values())
Packit Service 5a9772
			total += ((adapter.getCount() > 0) ? adapter.getCount() + 1 : 0);
Packit Service 5a9772
		return total;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	public int getViewTypeCount()
Packit Service 5a9772
	{
Packit Service 5a9772
		// assume that headers count as one, then total all sections
Packit Service 5a9772
		int total = 1;
Packit Service 5a9772
		for (Adapter adapter : this.sections.values())
Packit Service 5a9772
			total += adapter.getViewTypeCount();
Packit Service 5a9772
		return total;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	public int getItemViewType(int position)
Packit Service 5a9772
	{
Packit Service 5a9772
		int type = 1;
Packit Service 5a9772
		for (int i = 0; i < headers.getCount(); i++)
Packit Service 5a9772
		{
Packit Service 5a9772
			String section = headers.getItem(i);
Packit Service 5a9772
			Adapter adapter = sections.get(section);
Packit Service 5a9772
Packit Service 5a9772
			// skip empty sections
Packit Service 5a9772
			if (adapter.getCount() > 0)
Packit Service 5a9772
			{
Packit Service 5a9772
				int size = adapter.getCount() + 1;
Packit Service 5a9772
Packit Service 5a9772
				// check if position inside this section
Packit Service 5a9772
				if (position == 0)
Packit Service 5a9772
					return TYPE_SECTION_HEADER;
Packit Service 5a9772
				if (position < size)
Packit Service 5a9772
					return type + adapter.getItemViewType(position - 1);
Packit Service 5a9772
Packit Service 5a9772
				// otherwise jump into next section
Packit Service 5a9772
				position -= size;
Packit Service 5a9772
				type += adapter.getViewTypeCount();
Packit Service 5a9772
			}
Packit Service 5a9772
		}
Packit Service 5a9772
		return -1;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	public boolean areAllItemsSelectable()
Packit Service 5a9772
	{
Packit Service 5a9772
		return false;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	public boolean isEnabled(int position)
Packit Service 5a9772
	{
Packit Service 5a9772
		return (getItemViewType(position) != TYPE_SECTION_HEADER);
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	@Override public View getView(int position, View convertView, ViewGroup parent)
Packit Service 5a9772
	{
Packit Service 5a9772
		int sectionnum = 0;
Packit Service 5a9772
		for (int i = 0; i < headers.getCount(); i++)
Packit Service 5a9772
		{
Packit Service 5a9772
			String section = headers.getItem(i);
Packit Service 5a9772
			Adapter adapter = sections.get(section);
Packit Service 5a9772
Packit Service 5a9772
			// skip empty sections
Packit Service 5a9772
			if (adapter.getCount() > 0)
Packit Service 5a9772
			{
Packit Service 5a9772
				int size = adapter.getCount() + 1;
Packit Service 5a9772
Packit Service 5a9772
				// check if position inside this section
Packit Service 5a9772
				if (position == 0)
Packit Service 5a9772
					return headers.getView(sectionnum, convertView, parent);
Packit Service 5a9772
				if (position < size)
Packit Service 5a9772
					return adapter.getView(position - 1, null, parent);
Packit Service 5a9772
Packit Service 5a9772
				// otherwise jump into next section
Packit Service 5a9772
				position -= size;
Packit Service 5a9772
			}
Packit Service 5a9772
			sectionnum++;
Packit Service 5a9772
		}
Packit Service 5a9772
		return null;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	@Override public long getItemId(int position)
Packit Service 5a9772
	{
Packit Service 5a9772
		for (int i = 0; i < headers.getCount(); i++)
Packit Service 5a9772
		{
Packit Service 5a9772
			String section = headers.getItem(i);
Packit Service 5a9772
			Adapter adapter = sections.get(section);
Packit Service 5a9772
			if (adapter.getCount() > 0)
Packit Service 5a9772
			{
Packit Service 5a9772
				int size = adapter.getCount() + 1;
Packit Service 5a9772
Packit Service 5a9772
				// check if position inside this section
Packit Service 5a9772
				if (position < size)
Packit Service 5a9772
					return adapter.getItemId(position - 1);
Packit Service 5a9772
Packit Service 5a9772
				// otherwise jump into next section
Packit Service 5a9772
				position -= size;
Packit Service 5a9772
			}
Packit Service 5a9772
		}
Packit Service 5a9772
		return -1;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	public String getSectionForPosition(int position)
Packit Service 5a9772
	{
Packit Service 5a9772
		int curPos = 0;
Packit Service 5a9772
		for (int i = 0; i < headers.getCount(); i++)
Packit Service 5a9772
		{
Packit Service 5a9772
			String section = headers.getItem(i);
Packit Service 5a9772
			Adapter adapter = sections.get(section);
Packit Service 5a9772
			if (adapter.getCount() > 0)
Packit Service 5a9772
			{
Packit Service 5a9772
				int size = adapter.getCount() + 1;
Packit Service 5a9772
Packit Service 5a9772
				// check if position inside this section
Packit Service 5a9772
				if (position >= curPos && position < (curPos + size))
Packit Service 5a9772
					return section.toString();
Packit Service 5a9772
Packit Service 5a9772
				// otherwise jump into next section
Packit Service 5a9772
				curPos += size;
Packit Service 5a9772
			}
Packit Service 5a9772
		}
Packit Service 5a9772
		return null;
Packit Service 5a9772
	}
Packit Service 5a9772
}