Quel adaptateur utiliser pour utiliser HashMap dans un ListView

je veux utiliser HashMap pour une liste des éléments de AdapterListView. J'allais utiliser ArrayAdapter<> mais je ne peut pas car il travaille avec List<> une seule. Quelle carte dois-je utiliser?

24
demandé sur Eugene 2011-03-08 18:32:42
la source

6 ответов

il n'y a pas d'Adaptateur prédéfini qui va rendre un HashMap. Je suggère de créer votre propre adaptateur en étendant BaseAdapter.

Edit: il est possible d'utiliser HashMap avec et extended BaseAdapter, voici un exemple (non testé):

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;
    }
}

Cela vient avec la mise en garde suivante, l'ordre des éléments n'est pas garanti d'être le même ordre que vous l'avez ajouté. Ecrire cet exemple m'a fait réaliser; N'utilisez pas HashMap dans un adaptateur :)

53
répondu longhairedsi 2014-01-01 16:57:59
la source

Merci pour la réponse longhairedsi

Cela vient avec la mise en garde suivante, l'ordre des éléments n'est pas garanti d'être le même ordre que vous l'avez ajouté. Ecrire cet exemple m'a fait réaliser; N'utilisez pas HashMap dans un adaptateur :)

pour contourner ce problème, utilisez un LinkedHashMap à la place.

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;
    }
}
16
répondu Gorba 2011-11-08 13:52:53
la source

Vous pouvez obtenir un tableau de votre carte entrées:

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

cela étant dit, si vous prévoyez de mettre à jour votre carte ou d'utiliser des fonctionnalités de carte dans l'adaptateur, alors faire un adaptateur personnalisé n'est pas difficile et serait beaucoup plus logique.

Vous pouvez commencer par sous-classement BaseAdapter, qui fournit des implémentations pour toutes les méthodes D'Adaptateurs, sauf quelques-unes, que vous devez faire fonctionner.

2
répondu Matthew Willis 2011-03-08 18:42:32
la source

dans votre fichier d'adaptateur

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;
        }
    }

appelez cet adaptateur

public void showCinemas(HashMap<String, String> cinemas) {
    MyAdapter adapter = new MyAdapter(cinemas);
    list.setAdapter(adapter);
}
0
répondu Arpit Patel 2016-02-02 07:47:17
la source

pour maintenir l'ordre dans le dictionnaire, si le type de clé est applicable, vous pouvez toujours les ajouter à un ArrayList de leur propre, le trier en utilisant des Collections.trier, et travailler avec cela comme votre point de référence.

private ArrayList<String> mKeys = new ArrayList<>();

for (String aKey :data.keySet()){
        mKeys.add(aKey);
    }
Collections.sort(mKeys);
0
répondu Steve Tinx 2017-05-22 15:10:49
la source

ce que vous pouvez faire, IMHO, c'est générer une nouvelle liste pour les valeurs clés de Hashmap que vous essayez d'Ajouter, puis passer cette liste à l'adaptateur personnalisé. Puis importez la collection HashMap dans l'adaptateur et utilisez HashMap.get(key); de la liste des clés de référence.

0
répondu Raveesh Agarwal 2017-07-11 01:41:39
la source

Autres questions sur