从JSON填充Listview

有谁知道任何dynamic加载Json数据到ListView的例子,我见过的大多数例子只是使用某种静态数组。 我需要加载说10行的Json数据,然后在底部有更多的负载..以获得下一个10等等等使用JSON请示例….

程序员布鲁斯是正确的,没有默认的方式来做到这一点。 然而,有一个非常简单的方法来完成这个任务。 这里是我用来处理JSONArray的适配器。

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; } } 

Android没有一个现成的适配器,用JSON数组填充ListView ,就像使用数据库logging填充ListView一样。

我build议您习惯使用JSON数据填充您select的Java数据结构,并使用ListViews ,使用不同的自定义行从不同的集合填充它们。

下面是一个从JSON数组中填充List的简单示例,然后使用List来填充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 } } } 

尝试下面的内容:

JSONparsing器类:

 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; } } 

显示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); } }); } } } 

活动细节类:

 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); } }); } } } 

希望这可以帮助 ;)

dbaugh有一个很好的答案,但是这篇文章解释了如何将它用于我们不知道从哪里去的其他人。

我做了一个简单的JSONAdapter像这样:

 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(); } } 

然后当我需要一个特定的实例时,我必须重写适配器中的getView方法,具体需要:

 @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; } 

并设置这样的数据:

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