0

我正在尝试创建一个使用 json 提要填充自身的动态列表。
我想为每个部分添加一个标题,以防联赛名称当前 json 提要通过一个联赛名称提供,但我需要使列表动态化以防添加另一个。

将来这是我正在寻找的那种布局。

联赛名称 项目 项目 项目 联赛名称 2 项目 项目 项目

我试图让它工作,但我得到了一个NullPointerException,我不知道为什么?
希望我已经足够简洁,任何帮助都会受到重视。

到目前为止,这是我的代码:

活动

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();
    }

    }
}

分离式列表适配器

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"
    />
4

2 回答 2

1

我认为

    ExpandableListView

对你有用 你可以看demo

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.html

于 2012-05-03T09:30:47.700 回答
0

合并标题布局和列表项布局

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

当您想显示节标题时,

设置本节第一项的标题视图。

于 2012-05-03T09:29:13.833 回答