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

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