`
huiqinbo
  • 浏览: 344704 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

无废话Android 系列教程36-1 [模仿listview的工作原理&测试]

 
阅读更多

 声明: LinearLayout(线性布局) ,同时是一个View对象的容器;既然是一个容器就应该有addView的方法

 

1.  com.andy.listview包下  MainActivity.java

package com.andy.listview;

import java.util.List;

import com.andy.listview.R;
import com.andy.listview.dao.PersonDao2;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.andy.listview.domain.Person;

/**
 * 这是一个模仿listview 的类
 * @author huiqinbo
 *
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		LinearLayout ll_root = (LinearLayout)findViewById(R.id.ll_root);
		PersonDao2 dao = new PersonDao2(this);
		List<Person> persons = dao.findAllPerson();
		for(Person person : persons){
			String p = person.toString();
			TextView tv = new TextView(this);
			tv.setText(p);
			tv.setTextColor(Color.BLUE);
			tv.setTextSize(25);
			ll_root.addView(tv);
		}
		
	}

	
}

 

2. com.andy.listview包下  PersonSQLiteOpenHelper.java

package com.andy.listview;

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

/**
 * 创建PersonSQLiteOpenHelper类 继承SQLiteOpenHelper抽象类,此时必须创建构造方法
 * @author huiqinbo
 *
 */
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {

	//通过getSimpleName()方法获取到值为"PersonSQLiteOpenHelper"
	private static final String tag = PersonSQLiteOpenHelper.class.getSimpleName();

	/**
	 * 数据库的构造方法, 用来定义数据库的名称/数据库的查询结果集/数据库的版本号
	 * 
	 * 当版本号发生变化时才可以调用onUpgrade方法; 如版本号从1 →2
	 * @param context
	 * @param name
	 * @param factory
	 * @param version
	 */
	public PersonSQLiteOpenHelper(Context context) {
//		super(context, "person.db", null, 1);
		super(context, "person.db", null, 3);
		// TODO Auto-generated constructor stub
	}
	
	

	/**
	 * 数据库第一次被创建的时候调用的方法
	 * @param db 被创建的数据库
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table person (id integer primary key autoincrement, name varchar(20), number varchar(20))");
	}

	
	/**
	 * sqlite中ALTER TABLE语句不支持DROP COLUMN,只有RENAME 和ADD 语句.
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		Log.i(tag, "数据库的版本发生变化了");
		db.execSQL("alter table person add account varchar(20)");

	}

}

 

3. com.andy.listview.dao PersonDao2.java

package com.andy.listview.dao;

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

import com.andy.listview.PersonSQLiteOpenHelper;
import com.andy.listview.domain.Person;

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

public class PersonDao2 {
	private PersonSQLiteOpenHelper helper;
	public PersonDao2(Context context){
		helper = new PersonSQLiteOpenHelper(context);
	}
	
	/*
	 * 插入用户名和手机号到SQLite数据库
	 * 
	 * the row ID of the newly inserted row, or -1 if an error occurred
	 */
	public long addPerson(String name, String number,int account){
		
		//此时就获取到了数据库
		SQLiteDatabase db = helper.getWritableDatabase();
		//db.execSQL("insert into person (name,number) values (?,?)", new Object[]{name,number});
		ContentValues values = new ContentValues();
		values.put("name", name);
		values.put("number", number);
		values.put("account", account);
		long row_id = db.insert("person", null, values);
		db.close();
		return row_id;
	}
	
	/**
	 * 删除一条数据,按用户名的条件
	 * @param name
	 * 
	 * WhereClause :the optional WHERE clause to apply when deleting. Passing null will delete all rows.
	 */
	public int deletePerson(String name){
		SQLiteDatabase db = helper.getWritableDatabase();
//		db.execSQL("delete from person where name =?", new Object[]{name});
		int row_id = db.delete("person", "name=?", new String[]{name});
		db.close();
		
		return row_id;
	}
	
	
	/**
	 * 修改一条数据,按用户名的条件
	 * @param name
	 * @param number
	 */
	public int updatePerson(String name, String number){
		SQLiteDatabase db = helper.getWritableDatabase();
//		db.execSQL("update person set number = ? where name = ?", new Object[]{name,number} );
		ContentValues values = new  ContentValues();
		values.put("number", number);
		
		int row_id = db.update("person", values, "name=?", new String[]{name});
		db.close();
		
		return row_id;
	}
	
	/**
	 * 查询一条数据,按用户名的条件
	 * @param name
	 * @param number
	 * selection : A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given table.
	 * selectionArgs:  You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings.
	 */
	public boolean findPerson(String name){
		SQLiteDatabase db = helper.getWritableDatabase();
//		Cursor cursor = db.rawQuery("select * from person where name=?", new String[]{name});
		Cursor cursor = db.query("person", new String[]{"id", "name", "number"}, "name=?", new String[]{name}, null, null, null);
		boolean result = cursor.moveToNext();
		cursor.close();
		db.close();
		return result;
	}
	
	
	public List<Person> findAllPerson(){
		SQLiteDatabase db = helper.getWritableDatabase();
//		Cursor cursor = db.rawQuery("select * from person", null);
		Cursor cursor = db.query("person", new String[]{"id","name","number"}, null, null, null, null, null);
		List<Person> persons = new ArrayList<Person>(); 
		Person person;
		while(cursor.moveToNext()){
			int id = cursor.getInt(cursor.getColumnIndex("id"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String number = cursor.getString(cursor.getColumnIndex("number"));
			person = new Person(id,name,number);
			persons.add(person);
		}
		cursor.close();
		db.close();
		return persons;
	}

}

 

4. com.andy.listview.domain 包下的Person.java 类

package com.andy.listview.domain;

public class Person {
	private int id;
	private String name;
	private String number;
	
	public Person(int id, String name, String number){
		this.id = id;
		this.name= name;
		this.number = number;
	}
	
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", number=" + number
				+ "]";
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	
	

}

 

5.  com.andy.listview.test 包下的TestPersonListView.java

package com.andy.listview.test;

import java.util.List;
import java.util.Random;

import com.andy.listview.PersonSQLiteOpenHelper;
import com.andy.listview.dao.PersonDao2;
import com.andy.listview.domain.Person;

import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase;
import android.util.Log;

/**
 * 
 * @author huiqinbo
 *
 */
public class TestPersonListView extends AndroidTestCase {

	private static final String tag = TestPersonListView.class.getSimpleName();
	public PersonDao2 pd;

	/**
	 * getContext() 是测试框架给提供的上下文件 来源:android.test.AndroidTestCase.getContext()
	 * 
	 * 第一次执行时调用PersonSQLiteOpenHelper.java 内的onCreate方法,
	 * 当版本号发生变化时,会调用PersonSQLiteOpenHelper.java 内的onUpgrade方法.
	 */
	public void testCreatePersonDb() {
		PersonSQLiteOpenHelper db = new PersonSQLiteOpenHelper(getContext());
		// 打开或创建一个可写的数据库
		db.getWritableDatabase();
	}

	public void testAddPerson() {
		pd = new PersonDao2(getContext());
		
		Random random = new Random();
		for(int i=0; i<50; i++){
			pd.addPerson("ZhangSan"+i, "138001380"+i, random.nextInt(10000));
		}
	}
	
	
	//注:查询数据表的结构SQL语句:
	//select * from sqlite_master where type="table" and name="person";
}

 

6. res → layout 下的 activity_main.xml

<!--  其实这里是能满足展示的, 但不能滚动
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/ll_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.andy.listview.MainActivity"
    android:orientation="vertical"
    tools:ignore="MergeRootFrame" >
</LinearLayout>-->



<!-- 为了能在页面中进行多条数据时滚动, 所以加入了ScrollView . 对于任何一个View 都是要指定宽和高的!-->
<ScrollView 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">
    
	<LinearLayout 
	    android:id="@+id/ll_root"
	    android:layout_width="match_parent"
	    android:layout_height="match_parent"
	    tools:context="com.andy.listview.MainActivity"
	    android:orientation="vertical"
	    tools:ignore="MergeRootFrame" >
	</LinearLayout>
</ScrollView>

 

7. 效果如下:



 

 

8.  源码参照附件

 

 

 

注:如果只想查看具体一张表的表结构,比如查看person表的结构(也就是都有哪些字段, 字段的类型是什么),命令为:

select * from sqlite_master where type="table" and name="person";



 

 

 

 

 

 

 

 

  • 大小: 218.4 KB
  • 大小: 260.9 KB
分享到:
评论

相关推荐

    无废话Android 系列教程36 -2 [listview的工作原理及使用&测试]

    这篇“无废话Android系列教程36 -2”着重讲解了ListView的工作原理和使用方法,以及如何进行测试。以下是关于ListView的详细知识: 1. **ListView基本结构**: ListView由多个ListView项(ListView Item)组成,每...

    Android应用源码之drag-sort-listview-master.rar

    通过研究`drag-sort-listview-master`的源码,开发者不仅可以学习到拖放排序的实现,还可以深入了解Android ListView的工作原理,以及如何优雅地处理触摸事件和视图更新。这对于提升个人的Android开发技能,特别是...

    Android代码-Animated-Expanding-ListView

    For more details, visitAnimated-Expanding-ListView Developed by @LeonardoCardoso. Animated Expanding ListView provides a fancy animation on expanding or collapsing the content of a listview item. It...

    Android-react-native-timeline-listview.zip

    Android-react-native-timeline-listview.zip,React本机应用程序的时间线组件,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。

    drag-sort-listview

    "drag-sort-listview"是一个专为Android平台设计的开源库,它允许用户通过拖放操作来排序ListView中的项目。在Android开发中,ListView是展示大量数据的常用组件,但默认情况下,ListView并不支持直接的拖放排序功能...

    android-pulltorefresh-listview 下拉刷新ListView

    `android-pulltorefresh-listview`是一个专为ListView实现下拉刷新效果的开源库。这个库使得开发者能够轻松地将下拉刷新功能集成到他们的应用中,提高了用户体验。 首先,我们来看看`ListView`。ListView是Android ...

    21.[开源][安卓][拖拽]drag-sort-listview-master

    DragSortListView(DSLV)是Android ListView的一个扩展,支持拖拽排序和左右滑动删除功能。重写了TouchInterceptor(TI)类来提供更加优美的拖拽动画效果。 DSLV主要特性: 完美的拖拽支持; 在拖动时提供更平滑...

    android-pulltorefresh-listview

    本篇文章将深入探讨该库的工作原理以及如何在项目中集成和自定义`android-pulltorefresh-listview`。 一、`android-pulltorefresh`库简介 `android-pulltorefresh`库由英国开发者Chris Banes创建,它提供了一个可...

    android-world-of-listview-android

    总之,ListView是Android开发中不可或缺的一部分,掌握其工作原理和优化技巧对于构建高性能的移动应用至关重要。通过对虚拟化、适配器、项目属性、标头与脚注、列表选择器等知识点的深入理解,开发者可以充分利用...

    安卓listview相关相关-drag-sort-listview是一个支持拖拽排序和左右滑动删除功能的自定义ListView.rar

    在Android开发中,ListView是常用的数据展示组件,用于显示大量数据列表。然而,原生的ListView功能相对简单,不支持一些高级交互,如拖拽排序和滑动删除。本资源"drag-sort-listview"提供了一个自定义的ListView...

    ListView总结---关于ListView的一些分享

    本文将深入解析ListView的工作原理及其使用技巧,结合`ContactListActivity分析.doc`文档,帮助开发者更好地理解和优化ListView。 一、ListView的基本结构 ListView的核心组成部分包括Adapter、View Holder和...

    android的listview嵌套listview,列表嵌套列表 android studio版本

    本教程将详细讲解如何在Android Studio环境下实现ListView的嵌套,以满足这种复杂布局的需求。 首先,我们需要了解基本的ListView工作原理。ListView通过Adapter来获取并展示数据,Adapter是连接数据源与ListView的...

    Android代码-pinned-section-listview

    Easy to use ListView with pinned sections for Android 2.1 and higher. Pinned section is a header view which sticks to the top of the list until at least one item of that section is visible.     ...

    android-pro-listview.7z

    本资料"android-pro-listview.7z"将带你深入理解ListView的工作原理,优化技巧以及相关扩展。 一、ListView基本使用 ListView的核心在于它可以动态加载数据,只渲染屏幕可见的项,从而节省内存。通过Adapter与数据...

    Android-SlideListView(ListView侧滑实现)

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。`Android-SlideListView(ListView侧滑实现)`项目是针对ListView进行的一种扩展,它引入了侧滑手势来实现更多的交互功能,如滑动删除和滑动展开...

    Android--开发-- ListView下拉刷新 Demo.rar

    在Android应用开发中,ListView是常用的控件,用于展示大量数据列表。然而,为了提供更好的用户体验,许多应用都需要实现ListView的下拉刷新功能,让用户能够即时获取最新的数据。本示例"Android--开发-- ListView...

    Android--开发--ListView 中的item随意拖动.rar

    首先,要实现ListView的拖动功能,我们需要理解ListView的工作原理。ListView通过Adapter来获取并展示数据,每个item视图都是由一个View或ViewHolder对象表示。当用户触摸屏幕并滑动时,我们需要捕获这些触控事件,...

    安卓listview相关相关-Android列表类源码-pinned-section-listview效果.rar

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。本资源"安卓listview相关相关-Android列表类源码-pinned-section-listview效果.rar"主要关注ListView的一个优化特性——Pinned Section ListView...

Global site tag (gtag.js) - Google Analytics