Android自定义View之PinnerHeaderListView

来源:互联网 发布:日系男装淘宝 知乎 编辑:程序博客网 时间:2024/06/06 19:05

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;    }}
1 0
原创粉丝点击