如何使用 SparseArray 作为适配器的源?
Posted
技术标签:
【中文标题】如何使用 SparseArray 作为适配器的源?【英文标题】:How to use SparseArray as a source for Adapter? 【发布时间】:2014-03-07 19:45:24 【问题描述】:我有一个稀疏的值数组,我想在 Spinner 中填充它,当项目被选中时,我想获取 id(这是稀疏数组中的键)。
从 SparseArray 创建适配器的首选方法是什么?
是否可以对现有的适配器进行子类化,例如 BaseAdapter 或 ListAdapter,以便项目将 SparseArray 中的键作为项目 ID?
Not knowing how to achieve the above, I am thinking of creating a simple ArrayAdapter instance and giving it values from the SparseArray as a source and when the item is selected, to look up the key by the value, which I think won效率不高。
【问题讨论】:
我相信 BaseAdapter 是一个抽象类,而 ListAdapter 是用一个 List 扩展它来存储数据的。你可以很好地扩展 BaseAdapter。 【参考方案1】:创建BaseAdapter
的子类应该可以正常工作。例如。采取
public abstract class SparseArrayAdapter<E> extends BaseAdapter
private SparseArray<E> mData;
public void setData(SparseArray<E> data)
mData = data;
@Override
public int getCount()
return mData.size();
@Override
public E getItem(int position)
return mData.valueAt(position);
@Override
public long getItemId(int position)
return mData.keyAt(position);
并扩展它以获得一些实际功能。比如像
public class SparseStringsAdapter extends SparseArrayAdapter<String>
private final LayoutInflater mInflater;
public SparseStringsAdapter(Context context, SparseArray<String> data)
mInflater = LayoutInflater.from(context);
setData(data);
@Override
public View getView(int position, View convertView, ViewGroup parent)
TextView result = (TextView) convertView;
if (result == null)
result = (TextView) mInflater.inflate(android.R.layout.simple_list_item_1, null);
result.setText(getItem(position));
return result;
【讨论】:
谢谢,节省了我的时间:) 由于 SparseArrays 可以有与索引不同的键,当我得到 adapterView 时,是否可以访问 onlick 中项目的实际键? @Rachit 是的,例如,如果您在getView
中标记(例如pushing-pixels.org/2011/03/15/… 谈到这一点)视图或通过向您的自定义适配器添加一个方法以便您可以基于它在视图的位置上以上是关于如何使用 SparseArray 作为适配器的源?的主要内容,如果未能解决你的问题,请参考以下文章
ArrayList、LinkeList、HashMap和SparseArray数据结构透彻的理解