5

У меня есть редкий массив значений, который я хочу заполнить в Spinner, и когда элемент выбран, я хочу получить идентификатор (который является ключом из разреженного массива).Как использовать SparseArray в качестве источника для адаптера?

Каков предпочтительный способ создания адаптера из SparseArray?

Возможно ли подклассировать существующий адаптер, такой как BaseAdapter или ListAdapter. Таким образом, элементы будут иметь ключ из SparseArray как идентификатор элемента?

Не зная, как достичь вышеуказанного, я собираюсь создать простой экземпляр ArrayAdapter и присвоить ему значения из SparseArray в качестве источника и когда элемент будет выбран, найти ключ по значению, которое, я думаю, не будет эффективным.

+0

Я считаю, что BaseAdapter является абстрактным классом, а ListAdapter расширяет его списком для хранения данных. Вы можете очень хорошо расширить BaseAdapter. – midhunhk

ответ

13

Создание подкласса 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; 
    } 
} 
+0

Вот что я хотел, спасибо :) –

+0

Спасибо, сэкономил мое время :) –

+0

Так как SparseArrays может иметь ключи, отличные от индекса, можно ли получить доступ к фактическому ключу элемента в onlick, когда я получу адаптер? – Rachit