主要是实现ListView的getItemViewType和getViewTypeCount两个方法,对于分类本身也占用一个item。

package com.example.categorylistview.adapter;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import com.example.categorylistview.R;import com.example.categorylistview.bean.ImageCategory;import com.example.categorylistview.bean.ImageCategory.Image;public class CategoryAdapter extends BaseAdapter{    private static final int TYPE_CATEGORY_ITEM = 0;    private static final int TYPE_ITEM = 1;    private List mListData;    private LayoutInflater mInflater;    public CategoryAdapter(Context context, List pData) {        mListData = pData;        mInflater = LayoutInflater.from(context);    }    @Override    public int getCount() {        int count = 0;        if (null != mListData) {            // 所有分类中item的总和是ListVIew Item的总个数//            for (ImageCategory category : mListData) {//                count += category.//            }            count = mListData.size();        }        return count;    }    @Override    public Object getItem(int position) {        // 同一分类内,第一个元素的索引值        int categroyFirstIndex = 0;        for (ImageCategory category : mListData) {            int size = category.getItemCount();            // 在当前分类中的索引值            int categoryIndex = position - categroyFirstIndex;            // item在当前分类内            if (categoryIndex < size) {                return category.getItem(categoryIndex);            }            // 索引移动到当前分类结尾,即下一个分类第一个元素索引            categroyFirstIndex += size;        }        return null;    }    public Object getItemName(int position) {        // 同一分类内,第一个元素的索引值        int categroyFirstIndex = 0;        for (ImageCategory category : mListData) {            int size = category.getItemCount();            // 在当前分类中的索引值            int categoryIndex = position - categroyFirstIndex;            // item在当前分类内            if (categoryIndex < size) {                 return category.categoryName;            }            categroyFirstIndex += size;        }        return null;    }    @Override    public int getItemViewType(int position) {        int categroyFirstIndex = 0;        for (ImageCategory category : mListData) {            int size = category.getItemCount();            // 在当前分类中的索引值            int categoryIndex = position - categroyFirstIndex;            if (categoryIndex == 0) {                return TYPE_CATEGORY_ITEM;            }            categroyFirstIndex += size;        }        return TYPE_ITEM;    }    @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);        CategoryHolder categoryHolder;        ViewHolder viewHolder = null;        switch (itemViewType) {            case TYPE_CATEGORY_ITEM:                if (null == convertView) {                    categoryHolder = new CategoryHolder();                    convertView = mInflater.inflate(R.layout.category, null);                    categoryHolder.tv_category_title = (TextView) convertView.findViewById(R.id.tv_category_title);                    convertView.setTag(categoryHolder);                } else {                    categoryHolder = (CategoryHolder) convertView.getTag();                }                String itemName = (String) getItemName(position);                categoryHolder.tv_category_title.setText(""+itemName);                break;            case TYPE_ITEM:                if (null == convertView) {                    convertView = mInflater.inflate(R.layout.activity_main, null);                    viewHolder = new ViewHolder();                    viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);                    viewHolder.iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon);                    convertView.setTag(viewHolder);                } else {                    viewHolder = (ViewHolder) convertView.getTag();                }                ImageCategory.Image image = (Image) getItem(position);                String text = image.name+" "+image.size+" "+image.date;                // 绑定数据                viewHolder.tv_title.setText(text);                viewHolder.iv_icon.setImageResource(R.drawable.logo);                break;        }        return convertView;    }    @Override    public boolean areAllItemsEnabled() {        return false;    }    @Override    public boolean isEnabled(int position) {        return getItemViewType(position) != TYPE_CATEGORY_ITEM;    }    private class ViewHolder {        TextView tv_title;        ImageView iv_icon;    }    private static class CategoryHolder {        TextView tv_category_title;    }}
public class ImageCategory {    public String categoryName;    public List images;    public static class Image {        public String name;        public String url;        public String size;        public String date;        public Image(String name, String url, String size, String date) {            super();            this.name = name;            this.url = url;            this.size = size;            this.date = date;        }    }    public Object getItem(int pPosition) {        // Category排在第一位        if (pPosition == 0) {            return this;        } else {            return images.get(pPosition - 1);        }    }    /**     * 当前类别Item总数。Category也需要占用一个Item     *      * @return     */    public int getItemCount() {        return images.size() + 1;    }}
public class DataSource {    public static List getCategorys(){        List categorys = new ArrayList();        for (int i = 0; i < 5; i++) {            ImageCategory category = new ImageCategory();            category.categoryName="分类"+i;            List mImages = new ArrayList();            for (int j = 0; j < 5; j++) {                Image image = new Image(category.categoryName+"- 风景图片"+i,"image/path/"+j,"3"                        ,"2015-"+i+"-2"+j);                mImages.add(image);            }            category.images = mImages;            categorys.add(category);        }        return categorys;    }}
public class MainActivity extends Activity {    ListView mListView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView = (ListView) findViewById(R.id.lv_data);        mListView.setAdapter(new CategoryAdapter(this, DataSource.getCategorys()));        mListView.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view,                    int position, long id) {                String name = "";                int type = mListView.getAdapter().getItemViewType(position);                if (type ==CategoryAdapter.TYPE_CATEGORY_ITEM) {                    ImageCategory category = (ImageCategory) mListView.getAdapter().getItem(position);                    name = category.categoryName;                }else if (type ==CategoryAdapter.TYPE_ITEM) {                    Image category = (Image) mListView.getAdapter().getItem(position);                    name = category.name+" - "+category.size;                }                Toast t = Toast.makeText(getApplicationContext(), name+"", 0);                t.show();            }        });    }}

更多相关文章

  1. 手机上使用google 搜索引擎
  2. [经典]Android开源项目分类汇总和Android 优秀开源项目实现原理
  3. Android设计元素-操作栏
  4. Android的界面元素UI
  5. 【android】巧用android:divider属性设置LinearLayout中元素之间
  6. 使用风格化Android的GridView元素背景

随机推荐

  1. 每天学习一个Android中的常用框架——0.
  2. Android的消息通知--Notification
  3. Android(安卓)Gradle Task依赖
  4. Android(安卓)的ANR 问题解决
  5. Android传感器——方向传感器TYPE_ORIENT
  6. ViewPager添加动画效果(一行代码)
  7. MVVM踩坑
  8. Android(安卓)ArcGis 地图图层切换
  9. android >WebView 实现 JS , JAVA 互调
  10. Android(安卓)模拟登陆 保存密码(信息)到手