JSON
& listview
LL工作這樣的..
1.顯示項目列表
Android SDK提供了一種使用名爲android.app.ListActivity的超類快速顯示數據列表的便捷方法。該活動已經提供了一個ContentView,配置了一個ListView
,可以隨時使用和填充數據。
ListView現在需要給出要顯示的數據以及將該數據映射到行的方法。 ListAdaptors提供這種機制,並使用setListAdaptor在ListActivity的基礎ListView上進行設置。
版本的Android SDK提供的適配器(ArrayAdaptor)
知道如何處理任意數據的陣列到ListViews
(Android的SDK還附帶了其他幾個ListAdaptors
,如光標適配器,連接本地數據存儲到ListView時可以協助)。您還需要爲適配器提供可用於將元素呈現到每一行上的佈局。在下面的例子中,我們使用的是Android SDK中提供的佈局,simple_list_item_1管理,這是一個單一的文本標籤完美鋪設我們的單串:
String[] elements = {"Line 1", "Line 2"};
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, elements));
2.customizing各列表項的外觀
爲了實現這個目標,您將不得不超越內置佈局和ArrayAdaptor並實現您自己的目標。
首先創建一個ABC類,它可以用來保存作者和內容作爲字符串。然後創建並填充自定義列表項來顯示一些測試數據的對象:
public class ABC {
String userId;
String pwd;
}
在/res/layout/list_item.xml
創建一個佈局XML文件來定義兩個TextViews
顯示在不同的行內容和作者。爲了將它們一個顯示在另一個之上,使用LinearLayout,配置爲垂直渲染其中的每個元素(android:orientation="vertical")
。
一旦XML文件被創建,Android Eclipse插件會自動將其作爲參考添加到生成的R文件中。該R文件保存在項目的/ gen文件夾下,充當您的XML元素和Java代碼之間的橋樑。它允許您的Java代碼引用在/ res文件夾下創建的XML元素和文件。您剛剛創建的文件現在可以在Java代碼中引用爲R.layout.list_item
,因爲您將在自定義列表適配器中執行下一步操作。
創建一個名爲ListAdaptor
的私人類(活動內部),其中的子類ArrayAdaptor
。該類應該用於存儲正在顯示的ArrayList,並提供一種將對象映射到您在上面的佈局中創建的TextViews
的方法。
這個映射覆蓋了ListAdaptor,並且應該返回一個View對象,它填充了請求位置的數據內容。
完整的實現自定義abcListAdaptor的是以下:
private class abcListAdaptor extends ArrayAdapter<abc> {
private ArrayList<abc> abc;
public abcListAdaptor(Context context, int textViewResourceId, ArrayList<abc> items) {
super(context, textViewResourceId, items);
this.abc = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_item, null);
}
abc o = abc.get(position);
TextView tt = (TextView) v.findViewById(R.id.uid);
TextView bt = (TextView) v.findViewById(R.id.pwd);
tt.setText(o.userid);
bt.setText(o.pwd);
return v;
}
}
現在onCreate方法可以調整爲使用與創建的測試數據自定義列表適配器,如下圖所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
abc a = new abc();
a.userid = "tech";
a.pwd = "android";
ArrayList<abc> items = new ArrayList<abc>();
items.add(a);
abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, items);
setListAdapter(adaptor);
}
3.訪問遠程服務和解析數據
Android SDK包含軟件包aime d簡化對基於HTTP的API的訪問。 Apache HTTP類已包含在org.apache.http package
下。您將使用這些類以及org.json
類來解析從服務器返回的數據。
我們可以在Activity中創建一個私有方法,該方法發出請求,分析結果並返回對象的ArrayList
。下面列出的代碼發出請求並查找結果JSON array
,該代碼被迭代以提取每個文本和from_user元素。
ArrayList<abc> getDetail= new ArrayList<abc>();
try {
HttpClient hc = new DefaultHttpClient();
HttpGet get = new
HttpGet("<a href="http://your URL"></a>");
HttpResponse rp = hc.execute(get);
if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
String result = EntityUtils.toString(rp.getEntity());
JSONObject root = new JSONObject(result);
JSONArray sessions = root.getJSONArray("results");
for (int i = 0; i < sessions.length(); i++) {
JSONObject session = sessions.getJSONObject(i);
abc a = new abc();
a.uid = session.getString("user");
a.pwd = session.getString("password");
getDetail.add(a);
}
}
}
catch (Exception e) {
Log.e("Activity", "Error loading JSON", e);
}
現在替換先前通過調用構建在onCreate方法的自定義列表適配器時使用load方法將假數據。
abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, load());
4.creating響應的用戶界面
在當前狀態下的代碼有可能導致應用程序無響應(ANR)對話框出現,提示用戶退出你的應用潛力。這可能是由於數據在onCreate
等方法中執行的遠程請求的長期工作所致。
永遠不應在主應用程序線程(驅動用戶界面事件循環)上執行長時間運行的任務。它們應該被派生成子線程來執行工作。
雖然Java的Thread
類可以用於此任務,但是一個複雜因素是,一旦長時間運行的任務完成,它通常要更改用戶界面以報告結果(即,顯示從請求加載)。
由於Android UI工具箱不是線程安全的,所以用戶界面元素只能從主線程更改它們的狀態,因此後臺線程需要向主線程發回消息才能操作UI。
幸運的是,Android SDK提供了一個方便的類AsyncTask,它爲異步任務提供了一種安全地與UI線程交互的簡單機制。這是通過繼承AsyncTask並重寫doInBackground方法來執行長時間運行的任務,然後重寫onPostExecute在UI上執行任何操作來實現的。
當創建AsyncTask(它必須在UI線程上創建)並執行時,會在後臺線程上調用doInBackground方法。完成後,onPostExecute方法在主UI線程上被調用。
要在您的應用中使用它,您需要在Activity(如自定義適配器類)中實現一個名爲MyTask的私有類,它的子類爲AsyncTask。您可以用先前加載方法的內容覆蓋doInBackground方法。
不是返回ArrayList,而是在Activity中維護一個實例變量,以便數據可以在私有類中共享。然後在onPostExecute中,您可以使用數據設置List Adapter,就像之前在onCreate中所做的那樣。現在,onCreate方法只創建MyTask對象並調用execute方法。
立地爲的ListView是this & this。
-
問候
TechEnd官方
你可以張貼JSON對象的要顯示的一個例子嗎?另外,你只是想在列表中顯示名稱? –