ListView 分组实现方式巩固

实现效果:


实现源代码:

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

}

猜你喜欢

转载自blog.csdn.net/lvshuchangyin/article/details/74291606