特點(diǎn):讓ListView的指定條目在滑動(dòng)到頂部的時(shí)候固定在頭部扛邑,
github地址:https://github.com/beworker/pinned-section-listview
原理:定義接口PinnedSectionListAdapter繼承ListAdapter席纽,并增加isItemViewTypePinned方法來判斷當(dāng)前是否是Section(即固定的選項(xiàng))勾哩;
我們所寫的adapter要實(shí)現(xiàn)PinnedSectionListAdapter,并且按照自己的邏輯實(shí)現(xiàn)isItemViewTypePinned方法;
定義PinnedSectionListView繼承自ListView,設(shè)置onScrollListener,在onScroll方法中去判斷當(dāng)前firstVisiableItem是否是Section,如果是則通過dispatchDraw方法在頂部位置繪制當(dāng)前Section的View缤至,正好覆蓋著firstVisiableItem的View,看起來就像是固定在頭部一樣;
用法
- 只需將自己的Adapter實(shí)現(xiàn)PinnedSectionListAdapter俊性,并實(shí)現(xiàn)isItemViewTypePinned方法螃壤,如下:
class MyAdapter extends BaseAdapter implements PinnedSectionListAdapter{
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
//定義條目類型
private final int ITEM_NORMAL = 0;//普通數(shù)據(jù)條目
private final int ITEM_SECTION = 1;//需要固定的Section條目
/**
* 總共2種條目類型,一種是分類條目倡怎,一種是普通的數(shù)據(jù)條目
*/
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
BaseBean baseBean = list.get(position);
if(baseBean instanceof Person){
return ITEM_NORMAL;
}else {
return ITEM_SECTION;
}
}
/**
* 此處借助于itemViewType來判斷是否是需要固定的條目;
* 所以必須實(shí)現(xiàn)另外2個(gè)方法迅耘,就是getViewTypeCount和getItemViewType,
* 只有viewType是ITEM_SCTION的才需要固定
*/
@Override
public boolean isItemViewTypePinned(int viewType) {
return viewType==ITEM_SECTION;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = new TextView(MainActivity.this);
textView.setTextColor(Color.DKGRAY);
textView.setPadding(15, 15, 15, 15);
//根據(jù)條目類型來返回條目View,并且設(shè)置對(duì)應(yīng)的數(shù)據(jù)
int itemViewType = getItemViewType(position);
switch (itemViewType) {
case ITEM_NORMAL:
textView.setBackgroundColor(Color.WHITE);
Person person = (Person) list.get(position);
textView.setText(person.getName());
break;
case ITEM_SECTION:
textView.setBackgroundColor(Color.parseColor("#ff99cc00"));
SectionItem sectionItem = (SectionItem) list.get(position);
textView.setText(sectionItem.getSectionName());
break;
}
return textView;
}
}
- 數(shù)據(jù)的準(zhǔn)備如下,將列表數(shù)據(jù)和分類數(shù)據(jù)都添加到同一個(gè)集合:
// 準(zhǔn)備數(shù)據(jù)
// 添加小學(xué)生分類數(shù)據(jù)
list.add(new StuCategory("小學(xué)生"));
// 初始化小學(xué)生數(shù)據(jù)
for (int i = 0; i < 12; i++) {
list.add(new Stu("小學(xué)生 - " + i));
}
// 添加初中生分類數(shù)據(jù)
list.add(new StuCategory("初中生"));
// 初始化初中學(xué)生數(shù)據(jù)
for (int i = 0; i < 12; i++) {
list.add(new Stu("初中生 - " + i));
}
// 添加高中生分類數(shù)據(jù)
list.add(new StuCategory("高中生"));
// 初始化高中學(xué)生數(shù)據(jù)
for (int i = 0; i < 12; i++) {
list.add(new Stu("高中生 - " + i));
}