2010-09-14 60 views
0

這是一篇回覆,我找不到一個好的解決方案。我搜索了很多,我找不到像樣的東西。我不知道我使用的方法是否是最好的方法,但它的工作原理,我覺得這是一個相當乾淨的解決方案。如何獲取JSONArray以填充到ListActivity的ListView中

這裏要做一些假設。

  1. 你知道JSONArray是什麼,並且已經用某種數據填充了JSONArray。
{"result": 
    [ 
     {"ACTIVE":"1","ID":"1","MAX_POPULATION":"1000","NAME":"Server 1","URL":"http://local.orbitaldomination.com/"}, 
     {"ACTIVE":"1","ID":"2","MAX_POPULATION":"1000","NAME":"Server 2","URL":"http://server2.orbitaldomination.com/"} 
    ] 
} 

這是填充到我的JSONArray我的JSON代碼。

  1. 您已經創建了一個ListActivity,其中包含一個ListView元素,並且您已經創建了一個佈局。如果您需要了解更多信息如何做到這一點,你可以參考Creating Lists Using the ListActivity

好了,這裏是真正的魔力是..

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Pretty much ignore this .. it won't have anything to do with the example. 
    // Your setContentView should be your layout with your list element. 
    setContentView(R.layout.server_selection); 

    //psuedo code 
    //JArrayServers = JSONArray that has my data in it. 

    //Create a blank (for lack of better term) ArrayAdapter 
    ArrayAdapter<String> servers = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1); 

    //Loop though my JSONArray 
    for(Integer i=0; i< jArrayServers.length(); i++){ 
     try{ 
      //Get My JSONObject and grab the String Value that I want. 
      String obj = jArrayServers.getJSONObject(i).getString("NAME"); 

      //Add the string to the list 
      servers.add(obj); 
     }catch(JSONException e){ 

     } 
    } 
    //Add my Adapter via the setListAdapter function. 
    setListAdapter(servers); 

    //Display the listView 
    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 
} 

我創建從我可以一個空白ArrayAdapter告訴。然後,我循環通過數組獲取我的字符串並將其插入到適配器中,隨着我移動。最後,在循環結束時,我通過setListAdapter()函數插入適配器。

非常簡單,我認爲,但花了很多研究,拿出這個,從菜鳥。我相信你們所有的專家都會有更好的辦法。如果你這樣做,請將它張貼在容易找到的地方!

回答

1

另一種方法是創建您自己的適配器類,擴展爲BaseAdapter。例如,如果您需要爲每個ListView行添加多個數據,這將非常有用。

+0

同意,你可以發表一個例子..問題更多的是,有關網絡上很少有關於如何做這樣的事情的信息,這就是爲什麼我發佈了這個。如果你可以花幾分鐘時間發佈一個例子,我相信所有的觀衆都會喜歡看它是如何實現的。 – 2010-09-14 17:08:32

8

實現此目的的最佳方法實際上是滾動您自己的擴展BaseAdapter的自定義適配器。爲了避免對JSONArray進行無意義的迭代來填充數組並將其用於「常規」ArrayAdapter中,我一直在努力解決這個問題。我的情況與你的情況非常相似,只是我想填充微調而不是ListView。儘管如此,我會發布我找到的解決方案,因爲它可能對您或其他人有幫助。

在您的活動類:

public void initSpinner(JSONArray jsonArray) 
{ 
    Spinner spinner = new Spinner(this); 
    JSONArrayAdapter jsonArrayAdapter = new JSONArrayAdapter(this, countries, "Name"); 
    spinner.setAdapter(jsonArrayAdapter); 
} 

注意:字符串「名」我通過具有參數到我的適配器僅僅是我想看看在我的JSON數據,你的情況的關鍵,它可能是你正在尋找的任何關鍵。

接下來,您需要滾動您自己的微調列表項目,並將其包裝在RelativeLayout中。我在一個名爲spinner_item.xml這樣做:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:paddingLeft="5dip" > 

<TextView 
    android:id="@+id/spinnerListItemName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:textColor="#000000" 
    android:textSize="16dip" /> 

<RadioButton 
    android:id="@+id/spinnerRadioButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_alignParentRight="true" 
    android:paddingRight="6dip" 
    android:focusable="false" 
    android:clickable="false" /> 

<TextView 
    android:id="@+id/spinnerListItemID" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:visibility="invisible" /> 

</RelativeLayout> 

注意:id爲spinnerListItemID文本視圖我只是用,因爲我想存儲的最後一個按鈕,我選擇了模擬RadioButtonGroup的行爲的ID ,很可能有更好的方法來完成這個任務,這只是我在當時更適合的方式。

最後,也是最重要的,你需要創建JsonArrayAdapter類:

public class JSONArrayAdapter extends BaseAdapter implements OnTouchListener 
{ 

private ViewGroup group; 
private JSONArray items; 
private String key; 
private Context context; 
private String selectedItemID; 
private int selectedItemPosition; 

public JSONArrayAdapter(Context ctx, JSONArray array, String k) 
{ 
    super(); 
    this.items = array; 
    this.context = ctx; 
    this.key = k; 
    this.selectedItemPosition = -1; 
} 

public int getCount() 
{ 
    return items.length(); 
} 

public Object getItem(int position) 
{ 
    return position; 
} 

public long getItemId(int position) 
{ 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View view = convertView; 
    group = parent; 

    if (view == null) 
    { 
     LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = vi.inflate(R.layout.spinner_item, null); 
     view.setOnTouchListener(this); 
    } 

    String itemText = null; 
    String itemID = null; 

    try 
    { 
     JSONObject jsonObject = items.getJSONObject(position); 
     itemText = jsonObject.getString(key); 
     itemID = jsonObject.getString("ID"); 
    } 
    catch (JSONException e) 
    { 

    } 

    if (itemText != null) 
    { 
     TextView name = (TextView) view.findViewById(R.id.spinnerListItemName); 
     TextView id = (TextView) view.findViewById(R.id.spinnerListItemID); 
     RadioButton button = (RadioButton) view.findViewById(R.id.spinnerRadioButton); 

     if (name != null) 
      name.setText(itemText); 

     if (id != null) 
     { 
      id.setText(itemID); 
      id.setHint(position + ""); 
     } 

     if (id.getText().toString().equals(selectedItemID)) 
     { 
      button.setSelected(true); 
      button.setChecked(true); 
     } 
     else 
     { 
      button.setSelected(false); 
      button.setChecked(false); 
     } 
    } 

    if (selectedItemPosition == -1 && position == 0) 
     this.setFirstChosen(view); 

    return view; 
} 

private void setFirstChosen(View view) 
{ 
    RadioButton button = (RadioButton) view.findViewById(R.id.spinnerRadioButton); 
    button.setSelected(true); 
    button.setChecked(true); 

    selectedItemID = ((TextView) view.findViewById(R.id.spinnerListItemID)).getText().toString(); 
    selectedItemPosition = Integer.parseInt(((TextView) view.findViewById(R.id.spinnerListItemID)).getHint().toString()); 
} 

public boolean onTouch(View v, MotionEvent event) 
{ 
    RadioButton button = (RadioButton) v.findViewById(R.id.spinnerRadioButton); 

    if (selectedItemPosition != -1) 
    { 
     View previousView = group.getChildAt(selectedItemPosition); 
     if (previousView != null) 
     { 
      RadioButton previous = (RadioButton) previousView.findViewById(R.id.spinnerRadioButton); 
      previous.setSelected(false); 
      previous.setChecked(false); 
     } 
    } 

    button.setSelected(true); 
    button.setChecked(true); 
    selectedItemID = ((TextView) v.findViewById(R.id.spinnerListItemID)).getText().toString(); 
    selectedItemPosition = Integer.parseInt(((TextView) v.findViewById(R.id.spinnerListItemID)).getHint().toString()); 

    return false; 
} 

}

有你有它,工作就像一個魅力對我來說,我知道痛苦是對在網上找到這個問題的信息:)