/*
* Created by Angel Leon (@gubatron), Alden Torres (aldenml)
* Copyright (c) 2011-2014, FrostWire(R). All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.bt.download.android.gui.views;
import android.content.Context;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
/**
*
* @author gubatron
* @author aldenml
*
*/
public abstract class AbstractAdapter<T> extends ArrayAdapter<T> {
private final int layoutResId;
public AbstractAdapter(Context context, int layoutResId) {
super(context, 0);
this.layoutResId = layoutResId;
}
@Override
public final View getView(int position, View convertView, ViewGroup parent) {
T item = getItem(position);
if (convertView == null) {
convertView = View.inflate(getContext(), layoutResId, null);
}
setupView(convertView, parent, item);
return convertView;
}
@SuppressWarnings("unchecked")
protected final <V extends View> V findView(View view, int id) {
return (V) getView(view, getHolder(view), id);
}
protected abstract void setupView(View view, ViewGroup parent, T item);
private SparseArray<View> getHolder(View view) {
@SuppressWarnings("unchecked")
SparseArray<View> h = (SparseArray<View>) view.getTag();
if (h == null) {
h = new SparseArray<View>();
view.setTag(h);
}
return h;
}
private View getView(View view, SparseArray<View> h, int id) {
View v = null;
int index = h.indexOfKey(id);
if (index < 0) {
v = view.findViewById(id);
h.put(id, v);
} else {
v = h.valueAt(index);
}
return v;
}
public static abstract class OnItemClickAdapter<T> implements OnItemClickListener {
@Override
public final void onItemClick(AdapterView<?> parent, View view, int position, long id) {
try {
@SuppressWarnings("unchecked")
AbstractAdapter<T> adapter = (AbstractAdapter<T>) parent.getAdapter();
onItemClick(parent, view, adapter, position, id);
} catch (ClassCastException e) {
// ignore
}
}
public abstract void onItemClick(AdapterView<?> parent, View view, AbstractAdapter<T> adapter, int position, long id);
}
}