实现效果:
实现源代码:
public class MainActivity extends Activity {
private TestCatalogChapterAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView = (ListView) findViewById(R.id.listView);
// 数据
ArrayList<Category> listData = getData();
mAdapter = new TestCatalogChapterAdapter(this, listData);
// 适配器与ListView绑定
listView.setAdapter(mAdapter);
listView.setOnItemClickListener(new ItemClickListener());
}
private class ItemClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(getBaseContext(), (String)mAdapter.getItem(position),
Toast.LENGTH_SHORT).show();
}
}
/**
* 创建测试数据
*/
private ArrayList<Category> getData() {
ArrayList<TestCatalog> mData = new ArrayList<TestCatalog>();
TestCatalog categoryOne = new TestCatalog("第一章、中小学机器人教育意义");
categoryOne.addItem("机器人教育对学生工程意识培养的意义和作用");
categoryOne.addItem("中小学生开展机器人教育的意义");
categoryOne.addItem("机器人活动对学生行为变化的影响");
categoryOne.addItem("“机器人教育”离课堂还有多远?");
categoryOne.addItem("通过机器人教育探索人才培养新模式");
TestCatalog categoryTwo = new TestCatalog("中小学机器人教育现状和对策");
categoryTwo.addItem("我国中小学机器人教育的现状调查与分析");
categoryTwo.addItem("中小学机器人教育的现状与对策");
categoryTwo.addItem("机器人教育何以进入中小学课堂");
categoryTwo.addItem("中小学机器人竞赛现状以及存在的问题");
listData.add(categoryOne);
listData.add(categoryTwo);
return listData;
}
}
Adapter代码如下:
public class TestCatalogChapterAdapter extends BaseAdapter {
private static final int TYPE_CONTENT = 1;
private static final int TYPE_CONTENT_HEADER = 0;
private LayoutInflater mInflater;
private ArrayList<TestCatalog> mListData;
public TestCatalogChapterAdapter( Context context ) {
mInflater = LayoutInflater.from(context);
}
public void setData(ArrayList<TestCatalog> data){
mListData = data;
}
@Override
public int getCount() {
int count = 0;
if (null != mListData) {
// 所有分类中item的总和是ListVIew Item的总个数
for (TestCatalog catalog : mListData) {
count += catalog.getItemCount();
}
}
return count;
}
@Override
public Object getItem(int position) {
// 异常情况处理
if (null == mListData || position < 0|| position > getCount()) {
return null;
}
// 同一分类内,第一个元素的索引值
int categroyFirstIndex = 0;
for (TestCatalog catalog : mListData) {
int size = catalog.getItemCount();
// 在当前分类中的索引值
int categoryIndex = position - categroyFirstIndex;
// item在当前分类内
if (categoryIndex < size) {
return catalog.getItem( categoryIndex );
}
// 索引移动到当前分类结尾,即下一个分类第一个元素索引
categroyFirstIndex += size;
}
return null;
}
@Override
public int getItemViewType(int position) {
// 异常情况处理
if (null == mListData || position < 0|| position > getCount()) {
return TYPE_CONTENT;
}
int categroyFirstIndex = 0;
for (TestCatalog category : mListData) {
int size = category.getItemCount();
// 在当前分类中的索引值
int categoryIndex = position - categroyFirstIndex;
if (categoryIndex == 0) {
return TYPE_CONTENT_HEADER;
}
categroyFirstIndex += size;
}
return TYPE_CONTENT;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int itemViewType = getItemViewType(position);
switch (itemViewType) {
case TYPE_CONTENT_HEADER:
convertView = mInflater.inflate(R.layout.item_test_catalog_chapter_header, null);
TextView header = (TextView) convertView.findViewById(R.id.header);
if (position == 0){ convertView.findViewById(R.id.header_line).setVisibility(View.INVISIBLE);}
String content = (String) getItem(position);
header.setText( content );
break;
case TYPE_CONTENT:
ContentViewHolder contentViewHolder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_test_catalog_chapter, null);
contentViewHolder = new ContentViewHolder();
contentViewHolder.content = (TextView) convertView.findViewById(R.id.catalog_content);
convertView.setTag(contentViewHolder);
} else {
contentViewHolder = (ContentViewHolder) convertView.getTag();
}
contentViewHolder.content.setText( (String)getItem(position) );
break;
}
return convertView;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return getItemViewType(position) != TYPE_CONTENT_HEADER;
}
static class ContentViewHolder {
TextView content;
}
}
数据对象
public class TestCatalog {
private String mCategoryName;
private List<String> mCategoryItem = new ArrayList<>();
public TestCatalog(String mCategroyName) {
mCategoryName = mCategroyName;
}
public String getmCategoryName() {
return mCategoryName;
}
public void addItem(String pItemName) {
mCategoryItem.add(pItemName);
}
public String getItem(int pPosition) {
// Category排在第一位
if (pPosition == 0) {
return mCategoryName;
} else {
return mCategoryItem.get(pPosition - 1);
}
}
public int getItemCount() {
return mCategoryItem.size() + 1;
}
}