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
Répondre
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
}
}
}
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;
}
}
Vous ne devriez jamais avoir 'assert' dans le code de niveau de production. Est-ce que 'VenuesAdapter' est une faute de frappe? –
Copier la pâte, lancer une erreur, peut-on donner un exemple d'utilisation de ce code? –
Pouvez-vous poster R.layout.row? – Manos
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à.
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"));
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;)
Salut @ user788971, pourriez-vous s'il vous plaît accepter cette réponse si elle vous a aidé? –
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
De toute évidence, de nos jours, vous utiliseriez Volley pour traiter cette demande –
- 1. Remplir la liste de sélection de JSON
- 2. Remplir ListView à partir de la liste <String[]>
- 3. Remplir un WrapPanel à partir d'une liste
- 4. Remplir DataFormComboBoxField à partir d'une liste
- 5. Remplir la zone de liste déroulante ExtJS avec JSON
- 6. remplir un formulaire à partir de json (dojo)
- 7. remplir une liste déroulante à partir d'une liste d'objets
- 8. Remplir NSMutableArray de JSON
- 9. Remplir une liste imbriquée à partir d'une liste imbriquée
- 10. Remplir JTable à l'aide de la liste
- 11. analyse des données json à partir de la liste C#
- 12. Placez MKPlacemarks à partir de la liste JSON ..?
- 13. Remplir la liste Drop Dow à partir de la liste déroulante
- 14. Remplir une liste déroulante à partir de db
- 15. Remplir une liste déroulante à partir d'un type de valeur
- 16. Remplir une propriété de liste à partir d'une chaîne délimitée
- 17. Comment remplir une liste de chaînes à partir d'un DataTable?
- 18. remplir une liste déroulante à partir d'une base de données
- 19. Remplir la liste déroulante
- 20. MVVM et (dynamiquement) remplir une liste déroulante à partir de la valeur d'une autre liste déroulante
- 21. comment remplir la liste à partir d'arraylist retourné à partir d'ormlite?
- 22. Remplir une liste de cases à cocher à partir d'une liste de modèles
- 23. valeur ne pas remplir à la liste déroulante kendo
- 24. comment remplir la collection backbone à partir de json en utilisant le bouton
- 25. Remplir la valeur sélectionnée à partir de la liste déroulante dans la zone de texte
- 26. Comment remplir les informations de la base de données à partir de la liste déroulante?
- 27. remplir la zone de liste à partir de la zone de texte
- 28. Remplir datagridview à partir de la liste ou de la collection de paramètres
- 29. Comment remplir dynamiquement la zone de liste à partir de la base de données?
- 30. comment remplir des valeurs à la zone de liste à partir d'un tableau de chaînes
Im travaillant sur un même cas, s'il vous plaît poster ici si vous avez trouvé des solutions! –