Android自定义View之PinnerHeaderListView

PinnerHeaderListView提供头部停悬及Item分类功能

github开源地址 https://github.com/JimiSmith/PinnedHeaderListView

2个类
PinnedHeaderListView
SectionedBaseAdapter

使用
Activity布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <com.example.pinnedheaderlistview.pinnedheaderlistview.PinnedHeaderListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"/>
</LinearLayout>

实体类

public class Entry {
    public String time;//header
    public ArrayList<Item> items;

    public Entry(String time, ArrayList<Item> items) {
        this.time = time;
        this.items = items;
    }

    public Entry() {
    }

    //header下的item实体类
    public class Item {
        public String time;
        public String account;
        public String type;

        public Item(String time, String account, String type) {
            this.time = time;
            this.account = account;
            this.type = type;
        }
         public Item(){
        }
    }
}

Activity

public class MainActivity extends Activity {
    PinnedHeaderListView listView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (PinnedHeaderListView) findViewById(R.id.listView);
        initData();
    }

    //初始化数据
    private void initData() {
        ArrayList<Item> items1=new ArrayList<Item>();
        ArrayList<Item> items2=new ArrayList<Item>();
        ArrayList<Item> items3=new ArrayList<Item>();
        ArrayList<Item> items4=new ArrayList<Item>();

        Item item1=new Entry().new Item("01:00:00","100.00","现金");
        Item item2=new Entry().new Item("02:00:00","600.00","支付宝");
        Item item3=new Entry().new Item("03:00:00","7000.00","支票");
        Item item4=new Entry().new Item("04:00:00","100.00","现金");
        Item item5=new Entry().new Item("05:00:00","400.00","现金");
        Item item6=new Entry().new Item("06:00:00","300.00","现金");
        Item item7=new Entry().new Item("07:00:00","300.00","银行卡");
        Item item8=new Entry().new Item("08:00:00","111.00","现金");
        Item item9=new Entry().new Item("09:00:00","2000.00","支票");
        Item item10=new Entry().new Item("10:00:00","100.00","现金");
        Item item11=new Entry().new Item("11:00:00","200.00","现金");

        items1.add(item1);
        items1.add(item2);
        items1.add(item4);
        items1.add(item5);
        items2.add(item6);
        items2.add(item7);
        items2.add(item8);
        items3.add(item9);
        items3.add(item10);
        items4.add(item11);

        ArrayList<Entry> entries=new ArrayList<>();
        Entry entry1=new Entry("2017年1月",items1);
        Entry entry2=new Entry("2016年2月",items2);
        Entry entry3=new Entry("2016年3月",items3);
        Entry entry4=new Entry("2016年4月",items4);

        entries.add(entry1);
        entries.add(entry2);
        entries.add(entry3);
        entries.add(entry4);
        TestSectionedAdapter sectionedAdapter = new TestSectionedAdapter(this,entries);
        listView.setAdapter(sectionedAdapter);
    }
}

自定义Adapter继承SectionBaseAdapter

public class TestSectionedAdapter extends SectionedBaseAdapter {
    private LayoutInflater mInflater;
    private Context context;
    private ArrayList<Entry> entries;

    public TestSectionedAdapter(Context context, ArrayList<Entry> entries) {
        this.context = context;
        this.entries = entries;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public Object getItem(int section, int position) {
        return null;
    }

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

    //header的总数量
    @Override
    public int getSectionCount() {
        return entries.size();
    }

    //每个header[section]下的item个数,entries.get(section).items,这里用ListView作为Item因此返回1
    @Override
    public int getCountForSection(int section) {
        return 1;
    }

    @Override
    public View getItemView(final int section, int position, View convertView, ViewGroup parent) {
        ItemViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ItemViewHolder();
            convertView = mInflater.inflate(R.layout.list_item, null);
            viewHolder.listVIew = (ListView) convertView.findViewById(R.id.listView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ItemViewHolder) convertView.getTag();
        }
        viewHolder.listVIew.setAdapter(new TestAdapter(context, entries.get(section).items, section));
        return convertView;
    }

    @Override
    public View getSectionHeaderView(final int section, View convertView, ViewGroup parent) {
        HeaderViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new HeaderViewHolder();
            convertView = mInflater.inflate(R.layout.header_item, parent,false);
            viewHolder.textView = (TextView) convertView.findViewById(R.id.textItem);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (HeaderViewHolder) convertView.getTag();
        }
        viewHolder.textView.setText(entries.get(section).time);
        return convertView;
    }

    //item
    class ItemViewHolder {
        ListView listVIew;
    }

    //header
    class HeaderViewHolder {
        TextView textView;
    }
}

Item中ListView的Adapter

public class TestAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private Context context;
    private ArrayList<Item> items;
    private int index;//是哪个header下的item
    public TestAdapter(Context context, ArrayList<Item> items,int index) {
        this.context = context;
        this.items = items;
        this.index = index;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        // 初始化组件
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.list_item_item, parent, false);
            viewHolder.time = (TextView) convertView.findViewById(R.id.time);
            viewHolder.account = (TextView) convertView.findViewById(R.id.account);
            viewHolder.type = (TextView) convertView.findViewById(R.id.type);
            viewHolder.img = (ImageView) convertView.findViewById(R.id.img);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Item item = items.get(position);
        viewHolder.time.setText(item.time);
        viewHolder.type.setText(item.type);
        viewHolder.account.setText(item.account);
        viewHolder.img.setImageResource(R.mipmap.ic_launcher);
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "这是第"+(index+1)+"个entry下的第"+(position+1)+"个item", Toast
                        .LENGTH_SHORT).show();
            }
        });

        return convertView;
    }

    class ViewHolder {
        TextView time;
        TextView account;
        TextView type;
        ImageView img;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值