2012-09-28 57 views
7

我對Android完全陌生,目前正嘗試從JSON數組中生成listview,這是從我的服務器中提取出來的,我已經閱讀了很多教程,沒有運氣,有獨特的方法來做到這一點。請你指出一些資源可以開始。在Android中生成JSON的列表視圖

我已閱讀this頁但是我堅持用下面的代碼:

import josecgomez.com.android.dev.webservice.objects.alerts; 

給我「」因爲沒有標識的資源:

public class AlertsAdapter extends ArrayAdapter<alerts> 

謝謝,任何幫助是非常感謝!

+0

你可以張貼JSON對象的要顯示的一個例子嗎?另外,你只是想在列表中顯示名稱? –

回答

16

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方法。

立地的ListViewthis & this

-

問候

TechEnd官方

4

您需要將JSON對象的重要元素存儲到您自己創建的新對象中。

可以說您的JSON對象爲您提供名稱,日期和電話號碼的鍵,您需要一個包含該類信息的對象。

您的列表視圖將您的新類型的arrayadapter,列表視圖中的每個小區將包含被填充的對象的信息的用戶界面元素(如textviews)

它是至少有3步驟的過程,你需要解決的解決方案爲每這些步驟單獨

0

我建議您按照下列步驟操作:

  1. 獲取來自網絡的數據並將其存儲
  2. 傳遞STOR編數據適配器
  3. 適配器設置爲您的列表

第一步,我建議你使用AsyncTask類,它允許進行後臺操作併發布在UI線程上的結果,而無需獲得數據操縱線程和/或處理程序。其次,你必須根據你得到的JSON結構解析你的內容。最後,將您的數據傳遞給適配器以填充您的列表。

1

關於這個問題,我找到了很好的resource。現在我有了Json數據的列表。強烈推薦所有的新手。謝謝你們的幫助。

+1

我看不出Ashwani上面的答案無效的原因。就這麼簡單。 – Nitin

+3

你有非常有資格的答案不那麼有禮貌選擇你自己的答案作爲正確的答案... – dorjeduck

3

試試這個代碼在活動第一解析JSON數據轉換成String數組 ,然後設置你的適配器列表視圖建議立即進行刪除XML格式的活動

try 
    { 

    JSONArray jArray = new JSONArray(result); 
    JSONObject jObj=new JSONObject(); 
    String[] data=new String[jArray.length()] 

     for(int i=0;i<jArray.length();i++) 
     { 
      jObj= jArray.getJSONObject(i); 
      data[i]=json_data.getString("value"); 

     } 

     GameAdapter adapter = new GameAdapter(this, R.layout.listview_item_row, data); 
     listView1 = (ListView)findViewById(R.id.listView1); 
     listView1.setAdapter(adapter); 
} 
catch(Exception e) 
{ 
} 
+0

如果這段代碼不是幫助你,我會發布完整的代碼,請讓我知道如果你的問題沒有解決 –