Android中ListView分类

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:orientation = "vertical"
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent"
    >
    <ListView
        android:id = "@+id/categoryList"
        android:layout_width = "fill_parent"
        android:layout_height = "fill_parent"
        />
</LinearLayout>&nbsp;

分类Title实现:

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:minHeight = "30dip"
    android:gravity = "center_vertical"
    android:paddingLeft = "10dip"
    android:background = "@color/title_background_color"
    />&nbsp;

package com.flora;
import android.widget.Adapter;
public class Category {
    private String mTitle;

    private Adapter mAdapter;
    public Category(String title, Adapter adapter) {
        mTitle = title;
        mAdapter = adapter;
    }

    public void setTile(String title) {
        mTitle = title;
    }

    public String getTitle() {
        return mTitle;
    }

    public void setAdapter(Adapter adapter) {
        mAdapter = adapter;
    }

    public Adapter getAdapter() {
        return mAdapter;
    }

}&nbsp;

package com.flora;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class ListViewCategoryActivity extends Activity {

    private String [] mContacts = {"马英才", "张三", "李四"};
    private String [] mMusic = {"素顔", "庐州月", "半城烟沙"};
    private String [] mEBook = {"拆掉思维里的墙", "淡定力", "人脉决定命脉"};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mCategoryAdapter.addCategory("人名", new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mContacts));

        mCategoryAdapter.addCategory("音乐",new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMusic));

        mCategoryAdapter.addCategory("书籍",new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mEBook));

        ListView categoryList = (ListView) findViewById(R.id.categoryList);

        categoryList.setAdapter(mCategoryAdapter);
    }

    private CategoryAdapter mCategoryAdapter = new CategoryAdapter() {
        @Override
        protected View getTitleView(String title, int index, View convertView, ViewGroup parent) {
            TextView titleView;

            if (convertView == null) {
                titleView = (TextView)getLayoutInflater().inflate(R.layout.title, null);
            } else {
                titleView = (TextView)convertView;
            }

            titleView.setText(title);

            return titleView;
        }
    };

}

package com.flora;
import java.util.ArrayList;
import java.util.List;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
public abstract class CategoryAdapter extends BaseAdapter {
    private List<Category> categories = new ArrayList<Category>();

    public void addCategory(String title, Adapter adapter) {
        categories.add(new Category(title, adapter));
    }

    @Override
    public int getCount() {
        int total = 0;

        for (Category category : categories) {
            total += category.getAdapter().getCount() + 1;
        }

        return total;
    }
    @Override
    public Object getItem(int position) {
        for (Category category : categories) {
            if (position == 0) {
                return category;
            }

            int size = category.getAdapter().getCount() + 1;
            if (position < size) {
                return category.getAdapter().getItem(position-1);
            }
            position -= size;
        }

        return null;
    }
    @Override
    public long getItemId(int position) {
        return position;
    }

    public int getViewTypeCount() {
        int total = 1;

        for (Category category : categories) {
            total += category.getAdapter().getViewTypeCount();
        }

        return total;
    }
    public int getItemViewType(int position) {
        int typeOffset = 1;

        for (Category category : categories) {
            if (position == 0) {
                return 0;
            }

            int size = category.getAdapter().getCount() + 1;
            if (position < size) {
                return typeOffset + category.getAdapter().getItemViewType(position - 1);
            }
            position -= size;

            typeOffset += category.getAdapter().getViewTypeCount();
        }

        return -1;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int categoryIndex = 0;

        for (Category category : categories) {
            if (position == 0) {
                return getTitleView(category.getTitle(), categoryIndex,convertView, parent);
            }
            int size = category.getAdapter().getCount()+1;
            if (position < size) {
                return category.getAdapter().getView(position - 1, convertView, parent);
            }
            position -= size;

            categoryIndex++;
        }

        return null;
    }

    protected abstract View getTitleView(String caption,int index,View convertView,ViewGroup parent);

}&nbsp;

Android中ListView分类

时间: 2024-10-12 09:58:46

Android中ListView分类的相关文章

Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能

Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能 本文中阐述如何自定义EditText实现搜索框自定义的样式以及挤压字母的思路等 自定义EditText 相关的drawable文件 主界面以及相关的适配器 结果展示 定义要呈现的EditText的样式 public class ClearEditText extends EditText implements OnFocusChangeListener, TextWatcher { /** * 定义删

android中listview点击事件失效的灵异事件

首先说明一下我想实现的功能: 点击某个item之后,让其颜色发生变化.如果变化网上有很多例子,我就不班门弄斧了.Listview之所以点击没有反应是因为上图中绿色部分(自己定义的一个继承BaseAdapter的adapter来适应listview)将listview的item覆盖了.现在点击的只是自定义的adapter中的convertView. 其次,自定义的adapter中包含一个ImageView和二个TextView.代码如下: <?xml version="1.0" e

Android中ListView的addFooterView不显示的问题

mListView.addFooterView(btn_more, null, false); mListView.setAdapter(mBlogListAdapter); 把addFootView放在setAdapter之前就可解决. Android中ListView的addFooterView不显示的问题

Android中ListView选中时的黄色底色

Android的ListView中默认选中时底色为黄色,如何去掉呢 其中会用到一个属性: android:listSelector="#00000000" 这样就行了 Android中ListView选中时的黄色底色

Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

Android中ListView异步加载图片错位.重复.闪烁问题分析及解决方案 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而ImageView控件就是View对象通

Android中ListView分页加载数据

熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容.通常来说,一个应用在展现大量数据时,不会将全部的可用数据都呈现给用户,因为这不管对于服务端还是客户端来说都是不小的压力,因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.比如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个“加载更多”按钮,用户点击后,加载

Android中ListView分页加载数据-转

Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验.因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据. 下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListVie

Android中ListView下拉刷新的实现

ListView中的下拉刷新是非常常见的,也是经常使用的,看到有很多同学想要,那我就整理一下,供大家参考.那我就不解释,直接上代码了. 这里需要自己重写一下ListView,重写代码如下: [java] view plain copy package net.loonggg.listview; import java.util.Date; import android.content.Context; import android.util.AttributeSet; import androi

Android中ListView结合CheckBox判断选中项

本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作.通过一个Demo来展示该功能,选中ListView中的某一项,然后点击Button按钮来显示选中了哪些项. [1] 程序结构图如下: 其中Person.java是实体类,MainActivity.java是Activity组件类.listitem.xml是自定义的列表每项布局文件. [2] listitem.xml布局文件源码如下: [html]