有誰知道任何示例動態加載Json 數據到一個ListView中,我看到的大多數例子只是使用某種類型的 靜態數組。我需要加載說10行 JSON數據,然後在底部有更多的負載..讓使用JSON請 未來10等等等等 例子....從JSON填充列表視圖
回答
Android不有現成的適配器使用JSON數組填充ListView
,就像使用數據庫記錄填充ListView
一樣。
我建議您習慣使用JSON數據填充您選擇的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
}
}
}
程序員布魯斯是正確的,沒有默認的方式來做到這一點。但是,有一個非常乾淨和簡單的方法來完成這項工作。這裏是我用來處理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;
}
}
您不應該在生產級代碼中擁有'assert'。 VenuesAdapter是否是一個錯字? – 2012-01-19 17:37:51
試過複製粘貼,拋出錯誤,你能舉一個如何使用這段代碼的例子嗎? – 2012-04-29 14:21:36
你可以發表R.layout.row? – Manos 2015-02-20 15:10:35
dbaugh有一個很好的答案,但this文章解釋如何使用它爲我們其餘的誰不知道從哪裏裏去。
我做了一個簡單的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"));
請嘗試以下方法:
JSON解析器類:
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;
}
}
片段類放映列表視圖:
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);
}
});
}
}
}
希望這有助於;)
Hi @ user788971,如果它對你有幫助,你能接受這個答案嗎? – 2014-09-25 08:46:49
謝謝,HttpClient已被棄用,因爲您的帖子,更新的類可以在這裏找到: http://danielnugent.blogspot.com.by/2015/06/updated-jsonparser-with.html – NicoMinsk 2016-04-03 20:13:58
顯然現在你會使用Volley來處理這個請求 – 2016-04-04 06:46:51
- 1. 從JSON填充jquerymobile列表視圖
- 2. 從Json列表填充TableView
- 3. Android從JSON填充列表視圖(從edittext鏈接)
- 4. 填充列表視圖
- 5. 填充列表視圖
- 6. 從ListAdapter或SimpleCursorAdapter填充列表視圖
- 7. 從webservice填充列表視圖
- 8. 從數據庫填充列表視圖
- 9. 從組合框填充列表視圖
- 10. 從datareader填充列表視圖控制
- 11. 從SQL向Android填充JSON列表視圖
- 12. 填充表視圖使用JSON
- 13. 試圖填充與JSON的列表視圖
- 14. 從JSON填充列表(不是HTML)
- 15. 從json文件填充列表
- 16. 從JSON填充選擇列表
- 17. 從JSON填充下拉列表
- 18. 從JSON數據填充列表
- 19. 從json填充ID的下拉列表
- 20. 從JSON填充Highchart列
- 21. C#從列表中填充列表視圖
- 22. 如何JSON解析從MySQL的圖像和填充列表視圖
- 23. 如何在json中填充的列表視圖之間添加圖像視圖?
- 24. 從JSON填充表單(dojo)
- 25. 通過AddRange填充列表視圖
- 26. 填充粘滯列表視圖Android
- 27. 使用mvvm填充列表視圖
- 28. SQLite和填充列表視圖,android
- 29. 列表視圖不填充其父
- 30. 填充的ListView,空列表視圖
林上的類似的工作如果您發現任何解決方案,請在此發佈。 – 2013-04-03 04:14:36