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