2011-06-08 6 views
22

Est-ce que quelqu'un connaît des exemples pour charger dynamiquement des données Json dans un ListView, la plupart des exemples que j'ai vus utilisent simplement un tableau statique quelconque. Je dois dire charger 10 rangées de données JSON, puis au fond ont une charge plus .. pour obtenir les 10 prochaines etc etc. Exemples d'utilisation Json s'il vous plaît ....Remplir la liste à partir de JSON

+0

Im travaillant sur un même cas, s'il vous plaît poster ici si vous avez trouvé des solutions! –

Répondre

7

Android n'a pas de adaptateur prêt à l'emploi pour remplir un ListView avec un tableau JSON, comme il le fait pour remplir un ListView avec des enregistrements de base de données. Je recommande d'être à l'aise avec le remplissage d'une structure de données Java de votre choix avec les données JSON, et d'être à l'aise avec travailler avec ListViews, les peupler à partir de différentes collections, avec différentes lignes personnalisées.

Voici un exemple simple de remplissage d'un List à partir d'un tableau JSON, puis en utilisant la List pour remplir un ListView.

import java.util.ArrayList; 
import java.util.List; 

import org.json.JSONArray; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class Main extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    try 
    { 
     String jsonInput = "[\"one\",\"two\",\"three\",\"four\",\"five\",\"six\",\"seven\",\"eight\",\"nine\",\"ten\"]"; 
     JSONArray jsonArray = new JSONArray(jsonInput); 
     int length = jsonArray.length(); 
     List<String> listContents = new ArrayList<String>(length); 
     for (int i = 0; i < length; i++) 
     { 
     listContents.add(jsonArray.getString(i)); 
     } 

     ListView myListView = (ListView) findViewById(R.id.my_list); 
     myListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listContents)); 
    } 
    catch (Exception e) 
    { 
     // this is just an example 
    } 
    } 
} 
18

Programmeur Bruce a raison, il n'y a pas de moyen par défaut de le faire. Cependant, il existe un moyen très propre et simple d'accomplir cela. Voici l'adaptateur que j'utilise pour gérer JSONArrays.

class JSONAdapter extends BaseAdapter implements ListAdapter { 

    private final Activity activity; 
    private final JSONArray jsonArray; 
    private JSONAdapter(Activity activity, JSONArray jsonArray) { 
     assert activity != null; 
     assert jsonArray != null; 

     this.jsonArray = jsonArray; 
     this.activity = activity; 
    } 


    @Override public int getCount() { 

     return jsonArray.length(); 
    } 

    @Override public JSONObject getItem(int position) { 

     return jsonArray.optJSONObject(position); 
    } 

    @Override public long getItemId(int position) { 
     JSONObject jsonObject = getItem(position); 

     return jsonObject.optLong("id"); 
    } 

    @Override public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) 
      convertView = activity.getLayoutInflater().inflate(R.layout.row, null); 

     JSONObject jsonObject = getItem(position); 

     return convertView; 
    } 
} 
+2

Vous ne devriez jamais avoir 'assert' dans le code de niveau de production. Est-ce que 'VenuesAdapter' est une faute de frappe? –

+1

Copier la pâte, lancer une erreur, peut-on donner un exemple d'utilisation de ce code? –

+0

Pouvez-vous poster R.layout.row? – Manos

2

dbaugh a une bonne réponse, mais this après explique comment l'utiliser pour le reste d'entre nous qui ne savent pas où aller à partir de là.

1

J'ai fait simple JSONAdapter comme ceci:

public abstract class JSONAdapter extends BaseAdapter { 

private JSONArray array; 

@Override 
public int getCount() { 
    return array == null ? 0 : array.length(); 
} 

@Override 
public Object getItem(final int position) { 
    if (array == null | array.length() < position) { 
     return null; 
    } 
    try { 
     return array.get(position); 
    } catch (final JSONException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

@Override 
public long getItemId(final int position) { 
    return position; 
} 

public JSONObject getObject(final int position) { 
    return (JSONObject) getItem(position); 
} 

public void setData(final JSONArray data) { 
    array = data; 
    notifyDataSetChanged(); 
} 
} 

puis quand j'ai besoin d'une instance spécifique de celui-ci, je dois remplacer la méthode getView dans l'adaptateur avec mon besoin concret:

@Override 
public View getView(final int position, final View convertView, 
     final ViewGroup parent) { 
    final View view; 
    final ViewHolder holder; 
    if (convertView != null) { 
     view = convertView; 
     holder = (ViewHolder) view.getTag(); 
    } else { 
     view = context.getLayoutInflater().inflate(
       R.layout.<mylayout>, parent, false); 
     holder = new ViewHolder(); 
     holder.name = (TextView) view.findViewById(R.id.name); 
        [...] 
     view.setTag(holder); 
    } 
    final JSONObject jsonObj = getObject(position); 
    holder.name.setText(jsonObj.optString("name")); 
    [...] 
    return view; 
} 

et ensemble de données comme celle-ci:

final JSONObject json = new JSONObject(jsonString); 
adapter.setData(json.getJSONArray("projects")); 
3

Essayez le ci-dessous:

JSON Parser Classe:

public class JSONParser { 

    static InputStream is = null; 
    static JSONObject jObj = null; 
    static String json = ""; 

    // constructor 
    public JSONParser() { 

    } 

    // function get json from url 
    // by making HTTP POST or GET mehtod 
    public JSONObject makeHttpRequest(String url, String method, 
      List<NameValuePair> params) { 

     // Making HTTP request 
     try { 

      // check for request method 
      if (method == "POST") { 
       // request method is POST 
       // defaultHttpClient 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(url); 
       httpPost.setEntity(new UrlEncodedFormEntity(params)); 

       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 

      } else if (method == "GET") { 
       // request method is GET 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       String paramString = URLEncodedUtils.format(params, "utf-8"); 
       url += "?" + paramString; 
       HttpGet httpGet = new HttpGet(url); 

       HttpResponse httpResponse = httpClient.execute(httpGet); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 
      } 

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      json = sb.toString(); 
     } catch (Exception e) { 
      Log.e("Buffer Error", "Error converting result " + e.toString()); 
     } 

     // try parse the string to a JSON object 
     try { 
      jObj = new JSONObject(json); 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     // return JSON String 
     return jObj; 

    } 
} 

Fragment classe montrant Listview:

public static class EventFragment extends ListFragment { 

     ArrayList<HashMap<String, String>> eventsList; 
     private String url_all_events = //url goes here; 
     private ProgressDialog pDialog; 

     JSONParser jParser = new JSONParser(); 

     // JSON Node names 
     private static final String CONNECTION_STATUS = "success"; 
     private static final String TABLE_EVENT = "Event"; 
     private static final String pid = "pid"; 
     private static final String COL_GROUP = "Group"; 
     private static final String COL_NAME = "Event_Name"; 
     private static final String COL_DESC = "Event_Desc"; 
     private static final String COL_DATE = "Event_Date"; 
     private static final String COL_TIME = "Event_Time"; 

     JSONArray Events = null; 

     public static final String ARG_SECTION_NUMBER = "section_number"; 

     public EventFragment() { 
     } 

     public void onStart() { 
      super.onStart(); 

      eventsList = new ArrayList<HashMap<String, String>>(); 
      new LoadAllEvents().execute(); 

      // selecting single ListView item 
      ListView lv = getListView(); 

      // Lauching the Event details screen on selecting a single event 
      lv.setOnItemClickListener(new OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, 
         int position, long id) { 
        // getting values from selected ListItem 
        String ID = ((TextView) view.findViewById(R.id.pid)) 
          .getText().toString(); 

        Intent intent = new Intent(view.getContext(), 
          EventDetails.class); 
        intent.putExtra(pid, ID); 
        view.getContext().startActivity(intent); 
       } 
      }); 
     } 

     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_events, 
        container, false); 

      return rootView; 
     } 

     class LoadAllEvents extends AsyncTask<String, String, String> { 

      /** 
      * Before starting background thread Show Progress Dialog 
      * */ 
      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       pDialog = new ProgressDialog(getActivity()); 
       pDialog.setMessage("Just a moment..."); 
       pDialog.setIndeterminate(true); 
       pDialog.setCancelable(true); 
       pDialog.show(); 
      } 

      protected String doInBackground(String... args) { 
       // Building Parameters 
       List<NameValuePair> params = new ArrayList<NameValuePair>(); 
       // getting JSON string from URL 
       JSONObject json = jParser.makeHttpRequest(url_all_events, 
         "GET", params); 

       try { 
        // Checking for SUCCESS TAG 
        int success = json.getInt(CONNECTION_STATUS); 

        if (success == 1) { 
         // products found 
         // Getting Array of Products 
         Events = json.getJSONArray(TABLE_EVENT); 
         // looping through All Contacts 
         for (int i = 0; i < Events.length(); i++) { 
          JSONObject evt = Events.getJSONObject(i); 

          // Storing each json item in variable 
          id = evt.getString(pid); 
          group = evt.getString(COL_GROUP); 
          name = evt.getString(COL_NAME); 
          desc = evt.getString(COL_DESC); 
          date = evt.getString(COL_DATE); 
          time = evt.getString(COL_TIME); 

          // creating new HashMap 
          HashMap<String, String> map = new HashMap<String, String>(); 

          // adding each child node to HashMap key => value 
          map.put(pid, id); 
          map.put(COL_GROUP, group); 
          map.put(COL_NAME, name); 
          map.put(COL_DESC, desc); 
          map.put(COL_DATE, date); 
          map.put(COL_TIME, time); 

          // adding HashList to ArrayList 
          eventsList.add(map); 
         } 
        } else { 
         // Options are not available or server is down. 
         // Dismiss the loading dialog and display an alert 
         // onPostExecute 
         pDialog.dismiss(); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

       return null; 
      } 

      protected void onPostExecute(String file_url) { 
       // dismiss the dialog after getting all products 
       pDialog.dismiss(); 
       // updating UI from Background Thread 
       getActivity().runOnUiThread(new Runnable() { 
        public void run() { 
         ListAdapter adapter = new SimpleAdapter(getActivity(), 
           eventsList, R.layout.list_item, new String[] { 
             pid, COL_GROUP, COL_NAME, COL_DATE, COL_TIME }, 
           new int[] { R.id.pid, R.id.group, R.id.name, R.id.header, 
             R.id.title2 }); 

         setListAdapter(adapter); 
        } 
       }); 

      } 

     } 
    } 

Détail de l'activité Classe:

public class EventDetails extends Activity { 

    String pid; 
    TextView EvtName, EvtDesc, EvtDate, EvtTime, Header; 
    ImageView logo; 

    private String url_event_details = "http://centrubook.eu.pn/eventDetails.php"; 
    private ProgressDialog pDialog; 

    JSONParser jParser = new JSONParser(); 

    // JSON Node names 
    private static final String CONNECTION_STATUS = "success"; 
    private static final String TABLE_EVENT = "Event"; 
    private static final String COL_PID = "pid"; 
    private static final String COL_NAME = "Event_Name"; 
    private static final String COL_DESC = "Event_Desc"; 
    private static final String COL_DATE = "Event_Date"; 
    private static final String COL_TIME = "Event_Time"; 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     // Respond to the action bar's Up/Home button 
     case android.R.id.home: 
      NavUtils.navigateUpFromSameTask(this); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.eventdetails); 

     // ActionBar actionBar = getActionBar(); 
     // actionBar.setDisplayHomeAsUpEnabled(true); 

     EvtName = (TextView) findViewById(R.id.BombaName); 
     EvtDesc = (TextView) findViewById(R.id.BombaDesc); 
     EvtDate = (TextView) findViewById(R.id.BombaDate); 
     EvtTime = (TextView) findViewById(R.id.BombaTime); 
     logo = (ImageView) findViewById(R.id.BombaLogo); 

     Intent i = getIntent(); 
     pid = i.getStringExtra(COL_PID); 
     new getEventDetails().execute(); 
    } 

    class getEventDetails extends AsyncTask<String, String, String> { 

     String name, desc, date, time; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(EventDetails.this); 
      pDialog.setMessage("Just a moment..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... args) { 

      // Check for success tag 
      int success; 
      try { 
       List<NameValuePair> params = new ArrayList<NameValuePair>(); 
       params.add(new BasicNameValuePair("pid", pid)); 

       // getting product details by making HTTP request 
       // Note that product details url will use GET request 
       JSONObject json = jParser.makeHttpRequest(url_event_details, 
         "GET", params); 

       // json success tag 
       success = json.getInt(CONNECTION_STATUS); 
       if (success == 1) { 
        // successfully received product details 
        JSONArray eventsObj = json.getJSONArray(TABLE_EVENT); 

        // get first product object from JSON Array 
        JSONObject details = eventsObj.getJSONObject(0); 

        name = details.getString(COL_NAME); 
        desc = details.getString(COL_DESC); 
        date = details.getString(COL_DATE); 
        time = details.getString(COL_TIME); 

       } else { 
        // product with pid not found 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     protected void onPostExecute(final String file_url) { 
      pDialog.dismiss(); 

      runOnUiThread(new Runnable() { 
       public void run() { 

        EvtName.setText(name); 
        EvtDesc.setText(desc); 
        EvtDate.setText(date); 
        EvtTime.setText(time); 
        logo.setImageResource(R.drawable.events); 

       } 
      }); 
     } 
    } 
} 

Hope this helps;)

+0

Salut @ user788971, pourriez-vous s'il vous plaît accepter cette réponse si elle vous a aidé? –

+0

Merci, HttpClient est obsolète depuis votre publication, la classe mise à jour peut être trouvée ici: http://danielnugent.blogspot.com.by/2015/06/updated-jsonparser-with.html – NicoMinsk

+0

De toute évidence, de nos jours, vous utiliseriez Volley pour traiter cette demande –

Questions connexes