Thursday 4 April 2013

ListView SectionHeader

Create class  SectionedAdapter.java
========================
import java.util.ArrayList;
import java.util.List;

import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;

abstract public class SectionedAdapter extends BaseAdapter {
    abstract protected View getHeaderView(String caption, int index,
        View convertView, ViewGroup parent);

    private final List<Section> sections = new ArrayList<Section>();
    private static int TYPE_SECTION_HEADER = 0;

    public SectionedAdapter() {
    super();
    }

    public void addSection(String caption, Adapter adapter) {
    sections.add(new Section(caption, adapter));
    }

    public Object getItem(int position) {
    for (Section section : this.sections) {
        if (position == 0) {
        return (section);
        }

        int size = section.adapter.getCount() + 1;

        if (position < size) {
        return (section.adapter.getItem(position - 1));
        }

        position -= size;
    }

    return (null);
    }

    public int getCount() {
    int total = 0;

    for (Section section : this.sections) {
        total += section.adapter.getCount() + 1; // add one for header
    }

    return (total);
    }

    @Override
    public int getViewTypeCount() {
    int total = 1; // one for the header, plus those from sections

    for (Section section : this.sections) {
        total += section.adapter.getViewTypeCount();
    }

    return (total);
    }

    @Override
    public int getItemViewType(int position) {
    int typeOffset = TYPE_SECTION_HEADER + 1; // start counting from here

    for (Section section : this.sections) {
        if (position == 0) {
        return (TYPE_SECTION_HEADER);
        }

        int size = section.adapter.getCount() + 1;

        if (position < size) {
        return (typeOffset + section.adapter
            .getItemViewType(position - 1));
        }

        position -= size;
        typeOffset += section.adapter.getViewTypeCount();
    }

    return (-1);
    }

    public boolean areAllItemsSelectable() {
    return (false);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    int sectionIndex = 0;

    for (Section section : this.sections) {
        if (position == 0) {
        return (getHeaderView(section.caption, sectionIndex,
            convertView, parent));
        }

        int size = section.adapter.getCount() + 1;

        if (position < size) {
        return (section.adapter.getView(position - 1, convertView,
            parent));
        }

        position -= size;
        sectionIndex++;
    }

    return (null);
    }

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

    class Section {
    String caption;
    Adapter adapter;

    Section(String caption, Adapter adapter) {
        this.caption = caption;
        this.adapter = adapter;
    }
    }
}

======================================================
Create another class  SectionedDemo.java

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class SectionedDemo extends ListActivity {
    private static String[] items = { "Muscle Stiffness", "Vision Problems",
        "Weaknesss", "Depression" };

    @Override
    public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

    adapter.addSection("Wed Nov 3, 2010", new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, items));

    List<String> list = Arrays.asList(items);

    Collections.shuffle(list);

    adapter.addSection("Mon Nov 1, 2010", new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, list));

    list = Arrays.asList(items);

    Collections.shuffle(list);

    adapter.addSection("Tues  Oct, 31, 2010", new ArrayAdapter<String>(
        this, android.R.layout.simple_list_item_1, list));

    setListAdapter(adapter);
    }

    SectionedAdapter adapter = new SectionedAdapter() {
    @Override
    protected View getHeaderView(String caption, int index,
        View convertView, ViewGroup parent) {
        TextView result = (TextView) convertView;

        if (convertView == null) {
        result = (TextView) getLayoutInflater().inflate(
            R.layout.section_header, null);
        }

        result.setText(caption);

        return (result);
    }
    };
}
=============================================
Create xml file main.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:drawSelectorOnTop="true"
/>
==============================================
Create another xml named section_header.xml

<TextView   
    xmlns:android="http://schemas.android.com/apk/res/android"   
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    android:gravity="center"   
    style="?android:attr/listSeparatorTextViewStyle" />

No comments:

Post a Comment