Заполнение ListView из ArrayList <HashMap <String, String >>

У меня есть ArrayList<hashmap<contact, name="">></hashmap<contact,>, и я хочу заполнить его ListView. Здесь моя попытка (которая не работает)

ArrayList<hashmap<string, string="">> lista = new ArrayList<hashmap<string, string="">>();
 // Array of strings "titulos"
 String titulos[] = { "Dolar (Transferencia)", "Euro (Transferencia)",
 "Dolar (Efectivo)", "Euro (Efectivo)", "Dolar (cúcuta)",
 "Euro (cucuta)" };
 try {
 JSONObject json = result; // result is a JSONObject and the source is located here: https://dl.dropbox.com/u/8102604/dolar.json
 JSONObject root = json.getJSONObject("root"); 
 JSONArray items = root.getJSONArray("item");
 int j = 0; 
 for (int i = 0; i < items.length(); i++) {
 JSONObject item = items.getJSONObject(i);
 String key = item.getString("key");
 String mount = item.getString("mount");
 if (key.equals("TS") || key.equals("TE") || key.equals("EE")
 || key.equals("CE") || key.equals("ES")
 || key.equals("CS")) { // i did this since i only need the items where the key is equal to TS, TE, EE, CE, ES or CS.
 HashMap<string, string=""> map = new HashMap<string, string="">();
 map.put("id", String.valueOf(i));
 map.put(key, mount);
 lista.add(map);
 System.out.println(titulos[j] + "(" + key + "). BsF = " + mount); // just for debugging purposes
 j++; // add 1 to j if key is equal to TS, TE, EE, CE, ES or CS. In this way i can associate the two arrays (item and titulos)
 }
 }
 ListView lv = (ListView) myMainActivity.findViewById(R.id.listView1); // create a list view 
 lv.setAdapter(new ArrayAdapter<string>(contexto, android.R.layout.simple_list_item_1, lista)); // set adapter to the listview (not working)
 } catch (JSONException e) {
 Log.e("log_tag", "Error parsing data " + e.toString());
 }
}
</string></string,></string,></hashmap<string,></hashmap<string,>

Эта последняя строка бросает ошибку в eclipse:

The constructor ArrayAdapter<string>(Context, int, ArrayList<hashmap<string,string>>) is undefined
</hashmap<string,string></string>

Я пробовал все, но я все еще не мог заставить его работать, не могли бы вы мне помочь?

Спасибо заранее.

PS: Полный источник: https://gist.github.com/4451519

4 ответа

Просто используйте SimpleAdapter.

String[] from = new String[] { /* all your keys */};
int[] to = new int[] { /* an equal number of android.R.id.text1 */};
ListAdapter adapter = new SimpleAdapter(contexto, lista, android.R.layout.simple_list_item_1, from, to);

Было бы просто (и более логично), если каждый элемент вашего списка содержал одинаково сформированный объект, а не другой ключ каждый раз.

Я бы заменил

map.put(key, mount);

по

map.put("key", key);
map.put("value", mount);

а затем from и to просто:

String[] from = new String[] { "value" };
int[] to = new int[] { android.R.id.text1 };


Вам нужно будет создать свой собственный адаптер, если вы действительно хотите передать весь список HashMap s, поскольку ArrayAdapter ожидает, что третий параметр в вашем случае будет иметь тип List.

Вы должны следовать рекомендациям @ Tomislav Novoselec в комментариях и создать List из значений HashMap.


Вам нужно использовать свой собственный CustomArrayAdapter, как показано ниже, и использовать этот класс в своем коде.

public class CustomArrayAdapter extends BaseAdapter {
 private JSONArray jsonArray = null;
 public ImageAdapter(Context c, JSONArray jsonArray) {
 context = c;
 this.jsonArray = jsonArray;
 }
 public int getCount() {
 return jsonArray.length();
 }
 public View getView(int position, View convertView, ViewGroup parent) {
 //DO YOUR CODE HERE
 LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 if (convertView == null) {
 convertView = inflater.inflate(R.layout.list_item_view, null);
 }else{
 //Set values for your listview on the list item.
 convertView.findViewById(R.id.someID).setText("GetJSONTEXT");
 }
 }
}

МОЕ ПРЕДЛОЖЕНИЕ ДЛЯ ВАШЕЙ ОСНОВНОЙ ДЕЯТЕЛЬНОСТИ

package com.kustomrtr.dolarparalelovenezuela;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import com.loopj.android.http.*;
public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 AsyncHttpClient client = new AsyncHttpClient();
 client.get("http://192.168.1.5/dolar.json", new AsyncHttpResponseHandler() {
 @Override
 public void onSuccess(String response) {
 System.out.println(response);
 try {
 JSONObject json = new JSONObject(response); // result is a JSONObject and the source is located here: https://dl.dropbox.com/u/8102604/dolar.json
 JSONObject root = json.getJSONObject("root"); 
 JSONArray items = root.getJSONArray("item");
 ListView lv = (ListView) myMainActivity.findViewById(R.id.listView1); // create a list view 
 lv.setAdapter(new CustomArrayAdapter<string>(contexto, android.R.layout.simple_list_item_1, items));
 } catch (JSONException e) {
 Log.e("log_tag", "Error parsing data " + e.toString());
 }
 }
 });
 } 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 ***************().inflate(R.menu.activity_main, menu);
 return true;
 }
}
</string>


Вам нужно создать собственный пользовательский адаптер, расширив BaseAdapter на Android. Затем вы можете настроить свой пользовательский адаптер в ListView с помощью метода setAdapter в представлении списка.

Для справки см. ниже небольшой пример BaseAdapter. Вам нужно передать свой ArrayList к адаптеру.

http://jimmanz.blogspot.in/2012/06/example-for-listview-using-baseadapter.html

Надеюсь, что это поможет.

licensed under cc by-sa 3.0 with attribution.