J'ai HashMap, comment puis-je le mettre dans ListView? Quel adaptateur devez-vous utiliser?
public void showCinemas(HashMap<String, String> cinemas)
{
...//What?
list.setAdapter(adapter);
}
Faire classe d'adaptateur simple:
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(Android.R.id.text1)).setText(item.getKey());
((TextView) result.findViewById(Android.R.id.text2)).setText(item.getValue());
return result;
}
}
layout/my_adapter_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
>
<TextView
Android:id="@Android:id/text1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
/>
<TextView
Android:id="@Android:id/text2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
/>
</LinearLayout>
Votre code:
public void showCinemas(HashMap<String, String> cinemas) {
MyAdapter adapter = new MyAdapter(cinemas);
list.setAdapter(adapter);
}
HashMap est composé de 2 Collection (ou mieux 1 Collection et 1 Set), il n'est donc pas vraiment possible d'étendre ArrayAdapter; mais vous pouvez facilement obtenir une collection (ou mieux un ensemble) de Map.Entry et la convertir en liste:
De:
Map<String, Object> map = new HashMap<String, Object>();
à:
List<Map.Entry<String, Object>> list = new ArrayList(map.entrySet());
J'utilise donc un ArrayAdapter dérivé comme celui-ci:
class HashMapArrayAdapter extends ArrayAdapter {
private static class ViewHolder {
TextView tV1;
TextView tV2;
}
public HashMapArrayAdapter(Context context, int textViewResourceId, List<Map.Entry<String, Object>> objects) {
super(context, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(Android.R.layout.simple_list_item_2, parent, false);
viewHolder = new ViewHolder();
viewHolder.tV1 = (TextView) convertView.findViewById(Android.R.id.text1);
viewHolder.tV2 = (TextView) convertView.findViewById(Android.R.id.text2);
convertView.setTag(viewHolder);
} else
viewHolder = (ViewHolder) convertView.getTag();
Map.Entry<String, Object> entry = (Map.Entry<String, Object>) this.getItem(position);
viewHolder.tV1.setText(entry.getKey());
viewHolder.tV2.setText(entry.getValue().toString());
return convertView;
}
Et puis pour créer l'adaptateur:
ArrayAdapter adapter = new HashMapArrayAdapter(this.getActivity(), Android.R.layout.simple_list_item_2, new ArrayList(map.entrySet()));
Ceci a quelques similitudes avec la réponse de Zanna ci-dessus, mais est un peu plus propre, amélioré et plus complet. Je pense que c'est aussi simple que cela.
Adaptateur :
public class MapEntryListAdapter extends ArrayAdapter<Map.Entry<String, Object>>
{
public MapEntryListAdapter (Context context, List<Map.Entry<String, Object>> entryList)
{
super (context, Android.R.layout.simple_list_item_2, entryList);
}
@NonNull @Override
public View getView (int position, View convertView, ViewGroup parent)
{
View currentItemView = convertView != null ? convertView :
LayoutInflater.from (getContext ()).inflate (
Android.R.layout.simple_list_item_2, parent, false);
Map.Entry<String, Object> currentEntry = this.getItem (position);
TextView textViewKey = currentItemView.findViewById (Android.R.id.text1);
TextView textViewValue = currentItemView.findViewById (Android.R.id.text2);
textViewKey.setText (currentEntry.getKey ());
textViewValue.setText (currentEntry.getValue ().toString ());
return currentItemView;
}
}
MainActivity - champs:
private Map<String, Object> mMapItems; // original data source of all items
private List<Map.Entry<String, Object>> mListOfMapEntries; // list of entries from mMapItems
private MapEntryListAdapter mMapEntryListAdapter;
MainActivity - Méthode onCreate: (partie pertinente)
mMapItems = new LinkedHashMap<> ();
mMapItems.put ("Test Key", "Test Value"); // put in sample item #1
mMapItems.put ("Sample Key", "Sample Value"); // put in sample item #2
mListOfMapEntries = new ArrayList<> (mMapItems.entrySet ()); // create the list
mMapEntryListAdapter = new MapEntryListAdapter (this, mListOfMapEntries);
ListView listView = findViewById (R.id.list_view);
listView.setAdapter (mMapEntryListAdapter);
Remarque: De par sa conception, la source de données de cet adaptateur ne duplique pas l'entrée entryList entrante, mais pointe vers la même liste. Cela vous permet de modifier facilement les données de l'adaptateur dans MainActivity ou partout où vous avez la référence à un adaptateur de cet objet. Vous devrez ensuite appeler la méthode notifyDataSetChanged () de l'adaptateur pour l'informer de la modification de la liste afin qu'il mette à jour le contrôle ListView afin de refléter ces modifications.
Si le contenu de votre objet Map change ultérieurement, vous pouvez procéder comme suit pour importer ces mises à jour dans votre liste, puis dans votre ListView:
mListOfMapEntries.clear ();
mListOfMapEntries.addAll (mMapItems.entrySet ());
mMapEntryListAdapter.notifyDataSetChanged ();
Cela efface la liste de tous les éléments existants, puis ajoute les éléments de la mappe à la liste puis, très important encore, indique à l'adaptateur de mettre à jour le ListView.
(Remarque: ne créez PAS d'objet List ici (par opposition à la suppression et l'ajout illustrés ici) car vous ne modifierez plus la source de données de l'adaptateur qui pointe toujours vers la liste d'origine.)
C'est assez simple:
pour les éléments de la liste que vous allez créer, par exemple. Dites que vous devez mettre les enregistrements des étudiants dans des éléments de la liste tels que nom et adresse
private HashMap<String,Object> prepareListViewItems(Student[] student)
{
ArrayList<HashMap<String,Object>> listdata = new ArrayList<HashMap<String,Object>>();
for(int index=0;index<student.size();index++)
{
HashMap<String,Object> data = new HashMap<String,Object>();
data.put("roll", student[indxe].roll);
data.put("address", student[indxe].address);
data=null;
listdata.add(data);
}
return data;
}
private void setListAdapter(Student[] students)
{
TestListAdapter adapter = new TestListAdapter(prepareListViewItems(students))
list.setAdapter(adapter);
}
Toutefois, lorsque vous créez un adaptateur personnalisé, il n'est pas nécessaire de créer hashmap, seul un tableau suffit pour vous.