2011-03-08 18 views

Respuesta

2

Usted puede obtener una gran variedad de entradas de mapa:

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

Dicho esto, si usted está pensando en actualizar su mapa o el uso de las características del mapa en el adaptador y luego hacer un adaptador personalizado no es difícil y me tiene mucho más sentido.

Puede comenzar subclasificando BaseAdapter, que proporciona implementaciones para todos menos algunos de los métodos de Adapter que necesita para ejecutar.

+1

¿Cómo se maneja el 'No se puede crear una matriz genérica de Map.Entry ' ¿excepción? –

50

No hay adaptadores predefinidos que representen un HashMap. Sugiero crear su propio adaptador extendiendo BaseAdapter.

Editar: Es Posible utilizar HashMap con y extendió BaseAdapter, he aquí una (no probado) ejemplo:

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

Esto viene con la siguiente salvedad, el orden de los artículos no se garantiza que sea la misma orden para agregarlos Escribir este ejemplo me hizo darme cuenta; No utilice HashMap en un adaptador :)

+0

no puede usar HashMap es su clase BaseAdapter extendida porque BaseAdapter implementa ListAdapter. – Eugene

+2

Ejemplo agregado anteriormente – longhairedsi

+0

si alguien todavía está buscando una solución, le aconsejo que verifique mi respuesta a una pregunta similar: http: // stackoverflow.com/a/19467717/1891118 –

16

Gracias por la respuesta longhairedsi

Esto viene con la siguiente salvedad, el orden de los artículos no se garantiza que sea el mismo orden en que se ha añadido. Escribir este ejemplo me hizo darme cuenta; No utilice HashMap en un adaptador :)

Para evitar este problema, utilice un LinkedHashMap en su lugar.

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

Tuve el mismo problema. Estoy usando una lista > ahora en lugar de HashMap Klaasvaak

+2

Puede superar esta limitación utilizando un TreeMap. – Skynet

0

En el archivo de adaptador

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

Llamada este adaptador

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

para mantener el orden en el diccionario, si el tipo de clave es aplicable , siempre puedes agregarlos a una ArrayList propia, ordenar usando Collections.sort, y trabaje con eso como su punto de referencia.

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

for (String aKey :data.keySet()){ 
     mKeys.add(aKey); 
    } 
Collections.sort(mKeys); 
0

Lo que puede hacer, en mi humilde opinión, es generar una nueva lista porque ellos los valores clave de la Hashmap que usted está tratando de agregar y, a continuación, pasar a esa lista al adaptador personalizado. A continuación, importe la colección HashMap en el adaptador y use HashMap.get(key); de la lista de claves de referencia.

Cuestiones relacionadas