2012-05-03 93 views
0

我正在嘗試使用json摘要創建一個動態列表來填充自己。
我想爲每個部分添加一個標題,在目前json feed的聯盟名稱通過一個聯盟名稱進行饋送的情況下,但我需要使列表動態以防添加另一個聯盟名稱。帶標題的分隔列表視圖

未來,這是我正在尋找的佈局。

聯盟名稱 項目 項目 項目 聯盟名稱2 項目 項目 項目

我試圖得到它的工作,但我得到一個NullPointerException,我不知道爲什麼?
希望我已經足夠簡明,任何幫助將appriciated。

這是到目前爲止我的代碼:

活動

try{ 

    JSONObject obj = new JSONObject(FullData); 


    JSONObject objData = obj.getJSONObject("data"); 

    JSONArray jArray = objData.getJSONArray("structure"); 





    // JSONArray DivisionsArray = oneObject.getJSONArray("divisions"); 



//  for (int d=0; d < DivisionsArray.length(); d++){ 

    //  JSONObject DivDict = DivisionsArray.getJSONObject(d); 
    //  leagues.add(DivDict.getString("name")); 


    //} 





    //setListAdapter (new ArrayAdapter<String>(this, R.layout.single_item, leagues)); 

    //ListView list = getListView(); 
    //list.setTextFilterEnabled(true); 

// Create the ListView Adapter 
    adapter = new SeparatedListAdapter(this); 
    ArrayAdapter<String> listadapter = new ArrayAdapter<String>(this, R.layout.list_item, notes); 
    List<String> leagues = new ArrayList<String>(); 
    // Add Sections 
    for (int i = 0; i < jArray.length(); i++) 
     { 

     JSONObject oneObject = jArray.getJSONObject(i); 
     leagues.add(oneObject.getString("league_website_name")); 
     Log.d("lc", "leagues: " + leagues); 
      adapter.addSection(leagues, listadapter); 
     } 




    // Get a reference to the ListView holder 
    journalListView = (ListView) this.findViewById(R.id.list_item_title); 

    // Set the adapter on the ListView holder 
    journalListView.setAdapter(adapter); 

    // Listen for Click events 
    journalListView.setOnItemClickListener(new OnItemClickListener() 
     { 
      public void onItemClick(AdapterView<?> parent, View view, int position, long duration) 
       { 
        String item = (String) adapter.getItem(position); 
        Toast.makeText(getApplicationContext(), item, Toast.LENGTH_SHORT).show(); 
       } 
     }); 



    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    } 
} 

Separatedlistadapter

public class SeparatedListAdapter extends BaseAdapter 
    { 
     public final Map<String, Adapter> sections = new LinkedHashMap<String, Adapter>(); 
     public final ArrayAdapter<String> headers; 
     public final static int TYPE_SECTION_HEADER = 0; 

     public SeparatedListAdapter(Context context) 
      { 
       headers = new ArrayAdapter<String>(context, R.layout.list_header); 
      } 

     public void addSection(String section, Adapter adapter) 
      { 
       this.headers.add(section); 
       this.sections.put(section, adapter); 
      } 

     public Object getItem(int position) 
      { 
       for (Object section : this.sections.keySet()) 
        { 
         Adapter adapter = sections.get(section); 
         int size = adapter.getCount() + 1; 

         // check if position inside this section 
         if (position == 0) return section; 
         if (position < size) return adapter.getItem(position - 1); 

         // otherwise jump into next section 
         position -= size; 
        } 
       return null; 
      } 

     public int getCount() 
      { 
       // total together all sections, plus one for each section header 
       int total = 0; 
       for (Adapter adapter : this.sections.values()) 
        total += adapter.getCount() + 1; 
       return total; 
      } 

     @Override 
     public int getViewTypeCount() 
      { 
       // assume that headers count as one, then total all sections 
       int total = 1; 
       for (Adapter adapter : this.sections.values()) 
        total += adapter.getViewTypeCount(); 
       return total; 
      } 

     @Override 
     public int getItemViewType(int position) 
      { 
       int type = 1; 
       for (Object section : this.sections.keySet()) 
        { 
         Adapter adapter = sections.get(section); 
         int size = adapter.getCount() + 1; 

         // check if position inside this section 
         if (position == 0) return TYPE_SECTION_HEADER; 
         if (position < size) return type + adapter.getItemViewType(position - 1); 

         // otherwise jump into next section 
         position -= size; 
         type += adapter.getViewTypeCount(); 
        } 
       return -1; 
      } 

     public boolean areAllItemsSelectable() 
      { 
       return false; 
      } 

     @Override 
     public boolean isEnabled(int position) 
      { 
       return (getItemViewType(position) != TYPE_SECTION_HEADER); 
      } 

     public View getView(int position, View convertView, ViewGroup parent) 
      { 
       int sectionnum = 0; 
       for (Object section : this.sections.keySet()) 
        { 
         Adapter adapter = sections.get(section); 
         int size = adapter.getCount() + 1; 

         // check if position inside this section 
         if (position == 0) return headers.getView(sectionnum, convertView, parent); 
         if (position < size) return adapter.getView(position - 1, convertView, parent); 

         // otherwise jump into next section 
         position -= size; 
         sectionnum++; 
        } 
       return null; 
      } 

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

     public void addSection(List<String> leagues, 
       ArrayAdapter<String> listadapter) { 
      // TODO Auto-generated method stub 

     } 

    } 

list_complex.xml

<?xml version="1.0" encoding="utf-8"?> 
<!-- list_complex.xml --> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:paddingTop="10dip" 
    android:paddingBottom="10dip" 
    android:paddingLeft="15dip" 
    > 
    <TextView 
     android:id="@+id/list_complex_title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     /> 
    <TextView 
     android:id="@+id/list_complex_caption" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     /> 
</LinearLayout> 

list_header.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_header_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingTop="2dip" 
    android:paddingBottom="2dip" 
    android:paddingLeft="5dip" 
    style="?android:attr/listSeparatorTextViewStyle" /> 

list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<!-- list_item.xml --> 
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_item_title" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingTop="10dip" 
    android:paddingBottom="10dip" 
    android:paddingLeft="15dip" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    /> 
+0

你有沒有算出來對你有用嗎?我正在嘗試做同樣的事情,爲一個健身房的應用程序。我希望能夠從遠程數據庫中提取鍛鍊列表,然後按月分組顯示鍛鍊。 –

回答

0

合併頁眉佈局和列表項目佈局

<RelativeLayout 
    <TextView 
     android:id="@+id/header 
     android:visible="gone"/> 
    <TextView 
     android:id="@+id/your_content/> 
</RelativeLayout> 

當你想顯示節頭,

設置頁眉視圖本節的第一項。

+0

它似乎在這裏錯誤journalListView.setAdapter(adapter); – iamlukeyb

+0

你能否提供一些細節。 –