18_ListView实现分组效果

简单实现ListView分组的效果

    1.实现效果如下:

18_ListView实现分组效果_第1张图片

2.数据库准备数据

   

package com.example.contactdemo.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class ContactSQLiteOpenHelper extends SQLiteOpenHelper {

	private static String name = "contact.db";
	private static Integer version = 1;

	public ContactSQLiteOpenHelper(Context context) {
		super(context, name, null, version);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// 创建数据库表
		db.execSQL("create table user(_id integer primary key autoincrement,name varchar(50),phone varchar(12),sortkey varchar(10))");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

	}
}


3.创建实体Bean

  

package com.example.contactdemo.domain;

public class User {

	private Integer id;
	private String name;
	private String phone;
	private String sortKey;

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(Integer id, String name, String phone, String sortKey) {
		super();
		this.id = id;
		this.name = name;
		this.phone = phone;
		this.sortKey = sortKey;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getSortKey() {
		return sortKey;
	}

	public void setSortKey(String sortKey) {
		this.sortKey = sortKey;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", phone=" + phone
				+ ", sortKey=" + sortKey + "]";
	}

}


 

 4.创建Dao实现数据插入及查询

  

package com.example.contactdemo.dao;

import java.util.List;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.contactdemo.db.ContactSQLiteOpenHelper;
import com.example.contactdemo.domain.User;

public class UserDao {
	
	private ContactSQLiteOpenHelper helper;
	private List<User> data;
	private SQLiteDatabase db;
	
	public UserDao(Context context,List<User> data) {
		this.data=data;
		helper = new ContactSQLiteOpenHelper(context);
	}
	
	public void insert(User u){
		//获取SQLiteDatabase对象
		db = helper.getWritableDatabase();
		db.execSQL("insert into user(name,phone,sortkey) values(?,?,?)", new Object[]{u.getName(),u.getPhone(),u.getSortKey()});
		db.close();
	}
	
	
	/**
	 * 针对listView分组的情况
	 */
	public void getObjectHeader(){
		db = helper.getWritableDatabase();
		//查询出分组的数据  
		Cursor c = db.rawQuery("select distinct(sortkey) from user order by sortkey", null);
		//遍历分组
		while (c.moveToNext()) {
			//具体的某个组
			String sortKey = c.getString(c.getColumnIndex("sortkey"));
			User usort = new User();
			usort.setSortKey(sortKey);    
			data.add(usort);
			//查询这个组对应数据
			Cursor c2 = db.rawQuery("select _id,name,phone,sortkey from user where  sortkey=?", new String[]{sortKey});
			//遍历数据
			while(c2.moveToNext()){
				User user = new User();
				user.setId(c2.getInt(c2.getColumnIndex("_id")));
				user.setName(c2.getString(c2.getColumnIndex("name")));
				user.setPhone(c2.getString(c2.getColumnIndex("phone")));
				user.setSortKey(c2.getString(c2.getColumnIndex("sortkey")));
				data.add(user);
			}
			
			c2.close();
			
		}
		c.close();
		db.close();
	}

}

5 测试类插入数据及查询数据

 

package com.example.contactdemo.test;

import java.util.ArrayList;
import java.util.List;

import android.test.AndroidTestCase;

import com.example.contactdemo.dao.UserDao;
import com.example.contactdemo.domain.User;

public class UserTest extends AndroidTestCase {

	private UserDao userDao;

	private List<User> data = new ArrayList<User>();   

	public void testInsert() {
		userDao = new UserDao(getContext(), null);
		User u1 = new User(null, "陈红军", "15631293227", "c");

		User u2 = new User(null, "李军", "15631293227", "l");
		User u3 = new User(null, "红军", "15631293227", "h");
		User u4 = new User(null, "军军", "15631293227", "j");
		User u5 = new User(null, "红军", "15631293227", "h");
		User u6 = new User(null, "陈红军", "15631293227", "c");
		User u7 = new User(null, "汪红军", "15631293227", "w");
		User u8 = new User(null, "八戒", "15631293227", "b");
		User u9 = new User(null, "哈哈四", "15631293227", "h");
		User u10 = new User(null, "陈红军", "15631293227", "c");

		userDao.insert(u1);
		userDao.insert(u2);
		userDao.insert(u3);
		userDao.insert(u4);
		userDao.insert(u5);
		userDao.insert(u6);
		userDao.insert(u7);
		userDao.insert(u8);
		userDao.insert(u9);
		userDao.insert(u10);
	}

	public void testGetObjectHeader() {
		userDao = new UserDao(getContext(), data);
		userDao.getObjectHeader();
		
		
		for(User u:data){
			if(u.getId()==null){
				System.out.println("分组的key@@@@@"+u.getSortKey());
			}else{
				System.out.println("分组key对应的数据@"+u);
			}
		}
	}
}


6.adapter的实现

package com.example.contactdemo.adapter;

import java.util.List;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.example.contactdemo.R;
import com.example.contactdemo.domain.User;

public class UserAdapter extends BaseAdapter {

	private List<User> data;
	private Context context;

	public UserAdapter(Context context, List<User> data) {
		this.context = context;
		this.data = data;
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return data.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return data.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		View view = convertView;
		User u = data.get(position);
		// 根据标签类型加载不通的布局模板
		if (u.getId() == null) {
			// 如果是标签项
			view = View.inflate(context, R.layout.group_list_item_header, null);
		} else {
			// 否则就是数据项了
			view = View.inflate(context, R.layout.group_list_item, null);
		}
		// 显示名称
		TextView textView = (TextView) view
				.findViewById(R.id.group_list_item_text);
		if (u.getId() == null) {
			textView.setText(u.getSortKey());
		} else {
			textView.setText(u.getName());
		}
		// 返回重写的view
		return view;
	}

	public boolean isEnabled(int position) {
		User u = data.get(position);
		if (u.getId() == null) {
			return false;
		}

		return super.isEnabled(position);

	}

}


7.Activity的实现

  

package com.example.contactdemo;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

import com.example.contactdemo.adapter.UserAdapter;
import com.example.contactdemo.dao.UserDao;
import com.example.contactdemo.domain.User;

public class MainActivity extends Activity {

	//声明listView控件对象
	private ListView lv_users;
	//数据库操作对象
	private UserDao userDao;
	//显示的数据
	private List<User> data = new ArrayList<User>();
	//适配器对象
	private UserAdapter adapter;
	
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取listView控件对象
        lv_users = (ListView) findViewById(R.id.lv_users);
        //创建数据库操作对象
        userDao = new UserDao(this, data);
        //查询数据
        userDao.getObjectHeader();
        //创建适配器对象
        adapter = new UserAdapter(this, data);
        //设置控件的适配器
        lv_users.setAdapter(adapter);
    }
}


 

7.需要的布局文件

   7.1 activity_main.xml

     

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <ListView android:id="@+id/lv_users"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>


 

   7.2 group_list_item_header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/group_header"
    android:background="#555555"
    android:paddingLeft="10dip" >

    <TextView
        android:id="@+id/group_list_item_text"
        android:layout_width="wrap_content"
        android:layout_height="20dip"
        android:gravity="center_vertical"
        android:textColor="#ffffff" />

</LinearLayout>

 

   7.3 group_list_item.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:id="@+id/group_content"
    android:padding="8dip" >
    <!-- 图片和文字 -->
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/hello_world"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/group_list_item_text"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:paddingLeft="5dip"/>

</LinearLayout>


8.项目清单文件AndroidManifest.xml

  

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.contactdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.contactdemo" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

 

你可能感兴趣的:(18_ListView实现分组效果)