Какой адаптер использовать для использования HashMap в ListView

Я хочу использовать HashMap для списка элементов Adapter для ListView . Я собирался использовать ArrayAdapter<> но я не могу, потому что он работает только с List<> . Какой адаптер использовать?

Solutions Collecting From Web of "Какой адаптер использовать для использования HashMap в ListView"

Нет предопределенных адаптеров, которые будут отображать HashMap. Я предлагаю создать свой собственный адаптер, расширив BaseAdapter.

Изменить: можно использовать HashMap с расширенным базовым адаптером, и вот пример (непроверенный):

 public class HashMapAdapter extends BaseAdapter { private HashMap<String, String> mData = new HashMap<String, String>(); private String[] mKeys; public HashMapAdapter(HashMap<String, String> data){ mData = data; mKeys = mData.keySet().toArray(new String[data.size()]); } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(mKeys[position]); } @Override public long getItemId(int arg0) { return arg0; } @Override public View getView(int pos, View convertView, ViewGroup parent) { String key = mKeys[pos]; String Value = getItem(pos).toString(); //do your view stuff here return convertView; } } 

Это связано со следующим оговоркой: порядок предметов не гарантируется тем же заказом, который вы им добавили. Написание этого примера заставило меня понять; Не используйте HashMap в адаптере 🙂

Спасибо за ответ longhairedsi

Это связано со следующим оговоркой: порядок предметов не гарантируется тем же заказом, который вы им добавили. Написание этого примера заставило меня понять; Не используйте HashMap в адаптере 🙂

Чтобы обойти эту проблему, вместо этого используйте LinkedHashMap.

 public class HashMapAdapter extends BaseAdapter { private LinkedHashMap<String, String> mData = new LinkedHashMap<String, String>(); private String[] mKeys; public HashMapAdapter(LinkedHashMap<String, String> data){ mData = data; mKeys = mData.keySet().toArray(new String[data.size()]); } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(mKeys[position]); } @Override public long getItemId(int arg0) { return arg0; } @Override public View getView(int pos, View convertView, ViewGroup parent) { String key = mKeys[pos]; String Value = getItem(pos).toString(); //do your view stuff here return convertView; } } 

Вы можете получить массив записей в вашей карте:

 Entry<MyKey, MyValue>[] entries = map.entrySet().toArray(new Entry<MyKey, MyValue>[0]); 

При этом, если вы планируете обновлять свою карту или использовать функции карты в адаптере, то создание пользовательского адаптера не представляет трудностей и имеет смысл.

Вы можете начать с подкласса BaseAdapter , который обеспечивает реализацию для всех, кроме нескольких методов адаптера, которые вам нужны для запуска.

В файле адаптера

MyAdapter.java

  import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; import java.util.Map; public class MyAdapter extends BaseAdapter { private final ArrayList mData; public MyAdapter(Map<String, String> map) { mData = new ArrayList(); mData.addAll(map.entrySet()); } @Override public int getCount() { return mData.size(); } @Override public Map.Entry<String, String> getItem(int position) { return (Map.Entry) mData.get(position); } @Override public long getItemId(int position) { // TODO implement you own logic with ID return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { final View result; if (convertView == null) { result = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_adapter_item, parent, false); } else { result = convertView; } Map.Entry<String, String> item = getItem(position); // TODO replace findViewById by ViewHolder ((TextView) result.findViewById(R.id.text1)).setText(item.getKey()); ((TextView) result.findViewById(R.id.text2)).setText(item.getValue()); return result; } } 

Вызовите этот адаптер

 public void showCinemas(HashMap<String, String> cinemas) { MyAdapter adapter = new MyAdapter(cinemas); list.setAdapter(adapter); } 

Чтобы поддерживать порядок в словаре, если тип ключа применим, вы всегда можете добавить их в собственный ArrayList, сортировать его с помощью Collections.sort и работать с ним в качестве вашей контрольной точки.

 private ArrayList<String> mKeys = new ArrayList<>(); for (String aKey :data.keySet()){ mKeys.add(aKey); } Collections.sort(mKeys); 

Что вы можете сделать, IMHO, генерирует новый список для ключевых значений Hashmap, который вы пытаетесь добавить, а затем передайте этот список в пользовательский адаптер. Затем импортируйте коллекцию HashMap в адаптер и используйте HashMap.get(key); Из списка ссылочных ключей.