2

ListViewヘッダーがあり、複数行のAndroidでを作成する必要があります。これを使用して、課題のタイトルとその下の期日を表示します。割り当ては、「今後の割り当て」と「過去の割り当て」の2つのヘッダーに分類されます(もちろん、日付に基づきます)。

ヘッダーが機能し、割り当てのタイトルが正しく表示されていますが、リストに2行目を組み込む方法に困惑しています。

これが私のコードです:

ListCourseAssignments.java

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    final SeparatedListAdapter adapter;
    setContentView(R.layout.courseassignmentslistview);
    adapter = new SeparatedListAdapter(getContext());
    ArrayAdapter<String> upcomingList = new ArrayAdapter<String>(getContext(), R.layout.list_item, Homework.getUpcomingDates()); // Homework.getUpcomingDates() Returns string array
    ArrayAdapter<String> pastList = new ArrayAdapter<String>(getContext(), R.layout.list_item, Homework.getPastDates()); // Homework.getPastDates() Returns string array

    adapter.addSection("Upcoming Assignments", upcomingList); 
    adapter.addSection("Past Assignments", pastList);

    ListView lv = (ListView) findViewById(android.R.id.list);
    lv.setAdapter(adapter);

    lv.setOnItemClickListener(new OnItemClickListener(){
        @Override
        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();
        }
    });
}

SeparatedListAdapter.java

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

public SeparatedListAdapter(Context context) {
    headers = new ArrayAdapter<String>(context, R.layout.courseassignmentslistview_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;

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

        position -= size;
    }
    return null;
}

public int getCount() {
    int total = 0;
    for (Adapter adapter : this.sections.values()) total += adapter.getCount() + 1;
    return total;
}

@Override
public int getViewTypeCount() {
    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;

        if (position == 0) return 0;
        if (position < size) return type + adapter.getItemViewType(position - 1);

        position -= size;
        type += adapter.getViewTypeCount();
    }
    return -1;
}

public boolean areAllItemsSelectable() {
    return false;
}

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

@Override
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;

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

        position -= size;
        sectionnum++;
    }
    return null;
}

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

courseassignmentslistview_header.xml

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

courseassignmentslistview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ListView
        android:id="@+android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

listitem.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="16sp" >
</TextView>

これが現在の様子のスクリーンショットです。

編集:複数行のリストを作成する方法は知っていますが、ヘッダー付きのリスト(このような)と一緒にリストを作成する方法がわかりません...

4

1 に答える 1

1

これまでに持っているものでそれを行う方法はわかりませんが、CommonWare の MergeAdapter で行うことができます。

readme の引用:

MergeAdapter accepts a mix of Adapters and Views and presents them as one contiguous 
whole to whatever ListView it is poured into. This is good for cases where you have
multiple data sources, or if you have a handful of ordinary Views to mix in with lists 
of data, or the like.

ここで入手できます。

ここで使用の簡単な概要を書きました

MergeAdapter を使用すると、ビューを提供することでセクション ヘッダーを作成し、必要な 2 行形式を作成するようにアダプターを設定できます。

于 2012-05-23T04:25:54.867 に答える