Quiero usar HashMap
para obtener una lista de elementos de Adapter
para un ListView
. Iba a usar ArrayAdapter<>
pero no puedo porque solo funciona con List<>
. ¿Qué adaptador debo usar?Qué adaptador usaré para usar HashMap en un ListView
Respuesta
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.
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 :)
no puede usar HashMap es su clase BaseAdapter extendida porque BaseAdapter implementa ListAdapter. – Eugene
Ejemplo agregado anteriormente – longhairedsi
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 –
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;
}
}
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);
}
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);
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.
- 1. ¿Por qué usar un hashmap?
- 2. Android cómo usar el adaptador para listView sin extender listActivity
- 3. ¿Qué adaptador usar - BaseAdapter o ArrayAdapter?
- 4. ¿Qué adaptador CouchDB para Ruby debería usar?
- 5. ¿Qué nombre de clase debo usar para un Adaptador de patrón de adaptador?
- 6. ¿Por qué puedo usar cadenas como claves en un HashMap?
- 7. ListView cambio de datos del adaptador sin ListView se notifica
- 8. Filtrado ListView con adaptador personalizado (objeto)
- 9. ¿Cómo accedo a ListView desde el adaptador?
- 10. onItemClickListener con adaptador personalizado y listview
- 11. Listview con adaptador personalizado que contiene CheckBoxes
- 12. ListView con un adaptador personalizado, agregando elementos uno por uno
- 13. ¿Cuándo usaré uncaught_exception?
- 14. ¿Qué usar en Django: ListView o list_detail?
- 15. mejor manera de refrescar adaptador/ListView en Android
- 16. ¿Cómo puedo usar un adaptador JMS para escuchar Amazon SQS
- 17. ¿Cuál es el propósito de `convertView` en el adaptador ListView?
- 18. Clasificación de ListView por nombre del producto con adaptador personalizado?
- 19. CursorAdapter vs ArrayAdapter para un ListView
- 20. Qué es un patrón de adaptador bidireccional
- 21. ¿Está bien cambiar dinámicamente el adaptador de ListView?
- 22. Configuración del elemento ListView verificado a partir del adaptador
- 23. Configuración de un diseño para usar como vista vacía para un ListView en caso de que el adaptador tenga cero elementos en una actividad
- 24. XMLAdapter para HashMap
- 25. ¿Por qué MouseAdapter es un adaptador?
- 26. ¿Cuándo usaré PowerShell sobre las aplicaciones tradicionales?
- 27. cómo usar hashMap con JTable
- 28. "Adaptador" o "adaptador"?
- 29. Cuándo debería usar un Hashtable versus un HashMap
- 30. Buscar un HashMap en un ArrayList de HashMap
¿Cómo se maneja el 'No se puede crear una matriz genérica de Map.Entry' ¿excepción? –