原文地址:http://blog.csdn.net/u013210620/article/details/50116753
页面的布局样式如下:
先看数据库部分
DataBaseHelper这个类主要做的事情是:创建数据库、数据库表
- package com.dandy.sqlite;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteDatabase.CursorFactory;
- import android.database.sqlite.SQLiteOpenHelper;
- import android.text.TextUtils;
- public class DataBaseHelper extends SQLiteOpenHelper {
- /**
- * 数据库名字
- */
- private static final String DATABASE_NAME = "dandy.db";
- /**
- * 学生信息表名
- */
- protected static final String TABLE_NAME_STUDENT = "students";
- /**
- * 老师信息表
- */
- protected static final String TABLE_NAME_TEACHER = "teachers";
- /**
- * 在构造器里面,创建数据库的名字
- */
- public DataBaseHelper(Context context, int version) {
- this(context, DATABASE_NAME, null, version);
- }
- public DataBaseHelper(Context context, String name, CursorFactory factory,
- int version) {
- super(context, DATABASE_NAME, factory, version);
- }
- /**
- * 创建数据库
- */
- @Override
- public void onCreate(SQLiteDatabase db) {
- createTables(db);
- }
- /**
- * 数据库升级回调方法
- */
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- if (oldVersion < newVersion) {
- upgradeTables_method1(db, oldVersion);
- }
- }
- /**
- * 表创建
- */
- private void createTables(SQLiteDatabase db) {
- createStudentTable(db);
- }
- /**
- * 学生信息表的创建 public static final String CTEATETABLE =
- * "create table if not exists "; public static final String ID_AUTO =
- * " integer primary key autoincrement,"; public static final String TEXT =
- * " text "; public static final String TEXT_NOT_NULL = "text not null";
- * public static final String LEFT_PARENTHESES = "("; public static final
- * String RIGHT_PARENTHESES = ")"; public static final String COMMA = ",";
- * public static final String ALTER = "alter table "; public static final
- * String RENAME = " rename to "; public static final String INSERT =
- * "insert into "; public static final String DROPTABLE =
- * "drop table if exists "; public static final String SELECT = " select ";
- * public static final String ADD = " add "; public static final String FROM
- * = " from "; public static final String SPACE = " "; public static final
- * String DEFAULT = " default ";
- *
- * sql拼接的语句如下: create table if not exists students(id integer primary key
- * autoincrement,name text,age text,sex default 0)
- */
- private void createStudentTable(SQLiteDatabase db) {
- StringBuffer createStudentTableSql = new StringBuffer();
- createStudentTableSql.append(ConstantString.CTEATETABLE)
- .append(TABLE_NAME_STUDENT)
- .append(ConstantString.LEFT_PARENTHESES).append(BaseColum.ID)
- .append(ConstantString.ID_AUTO).append(BaseColum.NAME)
- .append(ConstantString.TEXT).append(ConstantString.COMMA)
- .append(BaseColum.AGE).append(ConstantString.TEXT)
- .append(ConstantString.COMMA).append(BaseColum.SEX)
- .append(ConstantString.DEFAULT).append("0")
- .append(ConstantString.RIGHT_PARENTHESES);
- db.execSQL(createStudentTableSql.toString());
- }
- /**
- * 老师信息表的创建
- */
- private void createTeacherTable(SQLiteDatabase db) {
- StringBuffer createTeacherTableSql = new StringBuffer();
- createTeacherTableSql.append(ConstantString.CTEATETABLE)
- .append(TABLE_NAME_TEACHER)
- .append(ConstantString.LEFT_PARENTHESES).append(BaseColum.ID)
- .append(ConstantString.ID_AUTO).append(BaseColum.NAME)
- .append(ConstantString.TEXT).append(ConstantString.COMMA)
- .append(BaseColum.AGE).append(ConstantString.TEXT)
- .append(ConstantString.RIGHT_PARENTHESES);
- db.execSQL(createTeacherTableSql.toString());
- }
- /**
- * 数据库升级,确定相邻的2个版本之间的差异,数据库可以依次迭代,如:V1-->V2,V2-->V3
- *
- * 优点:每次更新数据库的时候只需要在onUpgrade方法的末尾加一段从上个版本升级到新版本的代码,易于理解和维护
- *
- * 缺点:当版本变多之后,多次迭代升级可能需要花费不少时间,增加用户等待
- */
- private void upgradeTables_method1(SQLiteDatabase db, int oldVersion) {
- int upgradeVersion = oldVersion;
- // V1-->V2
- if (upgradeVersion == 1) {
- upgradeTables1(db);
- upgradeVersion = 2;
- }
- // V2-->V3
- if (upgradeVersion == 2) {
- upgradeTables2(db);
- }
- }
- /**
- * 数据库第一次升级,实现增加一张新表(如:teachers)
- */
- private void upgradeTables1(SQLiteDatabase db) {
- createTeacherTable(db);
- }
- /**
- * 数据库第二次升级,新增表的列数(students表中增加address列)
- */
- private void upgradeTables2(SQLiteDatabase db) {
- try {
- db.beginTransaction();
- addTableColums(db, TABLE_NAME_STUDENT, BaseColum.ADD, "text",
- "China");
- db.setTransactionSuccessful();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- db.endTransaction();
- }
- }
- /**
- * 增加数据库表中字段
- *
- * @param db
- * @param table
- * :表名
- * @param coloum
- * :字段名
- * @param type
- * :字段属性
- * @param def
- * :字段默认值
- */
- private void addTableColums(SQLiteDatabase db, String table, String colum,
- String type, String def) {
- try {
- StringBuffer addSql = new StringBuffer();
- addSql.append(ConstantString.ALTER)
- .append(table)
- .append(ConstantString.ADD)
- .append(colum)
- .append(type.startsWith(ConstantString.SPACE) ? type
- : ConstantString.SPACE + type);
- if (!TextUtils.isEmpty(def)) {
- if (def.contains("default")) {
- addSql.append(def.startsWith(ConstantString.SPACE) ? def
- : ConstantString.SPACE + def);
- } else {
- addSql.append(ConstantString.DEFAULT).append(def);
- }
- }
- db.execSQL(addSql.toString());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 学生信息表字段名
- */
- static class BaseColum {
- public static final String ID = "id";
- public static final String NAME = "name";
- public static final String AGE = "age";
- public static final String SEX = "sex";
- public static final String ADD = "address";
- }
- /**
- * 字符串常量
- */
- static class ConstantString {
- public static final String CTEATETABLE = "create table if not exists ";
- public static final String ID_AUTO = " integer primary key autoincrement,";
- public static final String TEXT = " text ";
- public static final String TEXT_NOT_NULL = "text not null";
- public static final String LEFT_PARENTHESES = "(";
- public static final String RIGHT_PARENTHESES = ")";
- public static final String COMMA = ",";
- public static final String ALTER = "alter table ";
- public static final String RENAME = " rename to ";
- public static final String INSERT = "insert into ";
- public static final String DROPTABLE = "drop table if exists ";
- public static final String SELECT = " select ";
- public static final String ADD = " add ";
- public static final String FROM = " from ";
- public static final String SPACE = " ";
- public static final String DEFAULT = " default ";
- }
- }
AbstractSQLManager 这个类的方法是提供了数据库关闭,打开的操作
- package com.dandy.sqlite;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import com.MvpApplication;
- import com.dandy.util.AppUtil;
- /**
- * 这个类作用: 提供数据库的关闭,打开操作
- */
- public class AbstractSQLManager {
- private DataBaseHelper mDataBaseHelper;
- private SQLiteDatabase mSQLitedb;
- public AbstractSQLManager() {
- openDataBase(MvpApplication.getApplication());
- }
- /**
- * 方法作用:
- * 创建数据库名字(有的话,就不会创建了)、并且获取getWritableDatabase
- */
- private void openDataBase(Context context) {
- if (mDataBaseHelper == null) {
- mDataBaseHelper = new DataBaseHelper(context,
- AppUtil.getVersionCode(context));
- }
- if (mSQLitedb == null) {
- mSQLitedb = mDataBaseHelper.getWritableDatabase();
- }
- }
- /**
- * @return
- * 创建数据库名字(有的话,就不会创建了)、并且获取getWritableDatabase
- */
- protected final SQLiteDatabase sqliteDB() {
- if (mSQLitedb == null) {
- openDataBase(MvpApplication.getApplication());
- }
- return mSQLitedb;
- }
- /**
- * 数据库关闭
- */
- public void close() {
- try {
- if (mSQLitedb != null && mSQLitedb.isOpen()) {
- mSQLitedb.close();
- mSQLitedb = null;
- }
- if (mDataBaseHelper != null) {
- mDataBaseHelper.close();
- mDataBaseHelper = null;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
上个类中需要获取全局变量,我是自定义了一个application(如果有好的方法,给我留言,多谢)
MvpApplication
- package com;
- import android.app.Application;
- public class MvpApplication extends Application{
- private static MvpApplication mApplication;
- @Override
- public void onCreate() {
- super.onCreate();
- MvpApplication.mApplication = this;
- }
- public static Application getApplication(){
- return mApplication;
- }
- }
AppUtil
- package com.dandy.util;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.nio.channels.FileChannel;
- import com.MvpApplication;
- import android.content.Context;
- import android.content.pm.PackageInfo;
- import android.content.pm.PackageManager.NameNotFoundException;
- import android.os.Environment;
- public class AppUtil {
- private static final String TAG = AppUtil.class.getSimpleName();
- /**
- * 获取应用当前版本号
- * @param mContext
- */
- public static int getVersionCode(Context mContext) {
- int versionCode = 1;
- if(mContext == null) {
- return versionCode;
- }
- try {
- PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(
- mContext.getPackageName(), 0);
- versionCode = packageInfo.versionCode;
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- }
- return versionCode;
- }
- /**
- * 拷贝数据库到sd卡
- *
- * @deprecated <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- */
- public static void copyDataBaseToSD(){
- if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
- return ;
- }
- File dbFile = new File(MvpApplication.getApplication().getDatabasePath("dandy")+".db");
- File file = new File(Environment.getExternalStorageDirectory(), "seeker.db");
- FileChannel inChannel = null,outChannel = null;
- try {
- file.createNewFile();
- inChannel = new FileInputStream(dbFile).getChannel();
- outChannel = new FileOutputStream(file).getChannel();
- inChannel.transferTo(0, inChannel.size(), outChannel);
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- try {
- if (inChannel != null) {
- inChannel.close();
- inChannel = null;
- }
- if(outChannel != null){
- outChannel.close();
- outChannel = null;
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
StudentSQLManager--这个类的作用是:提供一些业务方法
- package com.dandy.sqlite;
- import java.util.ArrayList;
- import java.util.List;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.text.TextUtils;
- import com.dandy.bean.Student;
- import com.dandy.sqlite.DataBaseHelper.BaseColum;
- public class StudentSQLManager extends AbstractSQLManager{
- private static StudentSQLManager instance;
- public static StudentSQLManager getInstance(){
- if(instance == null){
- synchronized (StudentSQLManager.class) {
- if(instance == null){
- instance = new StudentSQLManager();
- }
- }
- }
- return instance;
- }
- /**
- * 学生信息的插入
- * @param student
- */
- public void insertStudent(Student student){
- if(student == null){
- return;
- }
- ContentValues values = null;
- try {
- values = new ContentValues();
- values.put(BaseColum.NAME, student.getName());
- values.put(BaseColum.AGE, student.getAge());
- if(!TextUtils.isEmpty(student.getSex())){
- values.put(BaseColum.SEX, student.getSex());
- }
- sqliteDB().insert(DataBaseHelper.TABLE_NAME_STUDENT, null, values);
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(values != null){
- values.clear();
- values = null;
- }
- }
- }
- /**
- * 查找所有学生的信息
- */
- public List<Student> queryAllStudent(){
- List<Student> students = new ArrayList<Student>();
- Cursor cursor = null;
- try {
- cursor = sqliteDB().query(DataBaseHelper.TABLE_NAME_STUDENT, null, null, null, null, null, null);
- if(cursor != null && cursor.getCount() >0 && cursor.moveToFirst()){
- do {
- Student student = new Student();
- student.setId(cursor.getString(cursor.getColumnIndexOrThrow(BaseColum.ID)));
- student.setName(cursor.getString(cursor.getColumnIndexOrThrow(BaseColum.NAME)));
- student.setAge(cursor.getString(cursor.getColumnIndexOrThrow(BaseColum.AGE)));
- student.setSex(cursor.getString(cursor.getColumnIndexOrThrow(BaseColum.SEX)));
- students.add(student);
- } while (cursor.moveToNext());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(cursor != null){
- cursor.close();
- cursor = null;
- }
- }
- return students;
- }
- /**
- * 删除学生信息
- *
- * @param id
- */
- public int deleteStudent(String id){
- try {
- return sqliteDB().delete(DataBaseHelper.TABLE_NAME_STUDENT, BaseColum.ID+"=?", new String[]{id});
- } catch (Exception e) {
- e.printStackTrace();
- }
- return -1;
- }
- /**
- * 更新学生信息
- *
- * @param student
- */
- public int updateStudent(Student student){
- ContentValues values = null;
- try {
- values = new ContentValues();
- values.put(BaseColum.NAME, student.getName());
- values.put(BaseColum.AGE, student.getAge());
- if(!TextUtils.isEmpty(student.getSex())){
- values.put(BaseColum.SEX, student.getSex());
- }
- return sqliteDB().update(DataBaseHelper.TABLE_NAME_STUDENT, values, BaseColum.ID+"=?", new String[]{student.getId()});
- } catch (Exception e) {
- e.printStackTrace();
- }
- return -1;
- }
- }
接下来看M层
Student
- package com.dandy.bean;
- public class Student {
- private String id;
- private String name;
- private String age;
- private String sex;//male(0),female(1)
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAge() {
- return age;
- }
- public void setAge(String age) {
- this.age = age;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- @Override
- public String toString() {
- return "Student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
- }
- }
M层对外提供的方法StudentModel
- package com.dandy.bean;
- import java.util.List;
- import com.dandy.bean.Student;
- import com.dandy.sqlite.StudentSQLManager;
- public class StudentModel {
- private StudentSQLManager manager;
- public StudentModel() {
- this.manager = StudentSQLManager.getInstance();
- }
- public void insertStudent(Student student) {
- manager.insertStudent(student);
- }
- public List<Student> queryAllStudents() {
- return manager.queryAllStudent();
- }
- public List<Student> queryStudentBySex(String sex) {
- return null;
- }
- public int deleteStudent(String id) {
- return manager.deleteStudent(id);
- }
- public int updateStudent(Student student) {
- return manager.updateStudent(student);
- }
- }
接下来看V层
IStudentView
- package com.dandy.view;
- import java.util.List;
- import com.dandy.bean.Student;
- public interface IStudentView {
- /**
- * 所有学生信息的获取展示
- * @params students
- */
- void showAllStudents(List<Student> students);
- /**
- * 学生信息的删除
- * @params stident
- */
- void deleteStudent(Student student);
- /**
- * 更新学生信息
- */
- void updateStudent(Student student);
- /**
- * 获取学生姓名
- */
- String getName();
- /**
- * 获取学生年龄
- */
- String getAge();
- /**
- * 获取学生性别
- */
- String getSex();
- }
接下来看P层
StudentPresenter
- package com.dandy.presenter;
- import java.util.List;
- import android.content.Context;
- import android.text.TextUtils;
- import android.widget.Toast;
- import com.dandy.bean.Student;
- import com.dandy.bean.StudentModel;
- import com.dandy.view.IStudentView;
- public class StudentPresenter {
- private Context mContext;
- private IStudentView mStudentView;
- private StudentModel mStudentModel;
- public StudentPresenter(Context mContext, IStudentView mStudentView) {
- this.mContext = mContext;
- this.mStudentView = mStudentView;
- this.mStudentModel = new StudentModel();
- }
- /**
- * 保存学生的信息
- *
- * @param student
- */
- public void saveStudentInfo() {
- Student student = new Student();
- student.setName(mStudentView.getName());
- student.setAge(mStudentView.getAge());
- student.setSex(mStudentView.getSex());
- mStudentModel.insertStudent(student);
- Toast.makeText(mContext, student.toString(), Toast.LENGTH_SHORT).show();
- }
- /**
- * 加载学生信息
- */
- public void loadAllStudent() {
- List<Student> students = mStudentModel.queryAllStudents();
- mStudentView.showAllStudents(students);
- }
- /**
- * 根据性别加载学生信息
- *
- * @param sex
- */
- public void loadStudentsBySex(String sex) {
- if (TextUtils.isEmpty(sex)) {
- return;
- }
- List<Student> students = mStudentModel.queryStudentBySex(sex);
- mStudentView.showAllStudents(students);
- }
- /**
- * 删除学生的信息
- *
- * @param student
- */
- public void deleteStudent(Student student) {
- if (student == null) {
- return;
- }
- String id = student.getId();
- if (TextUtils.isEmpty(id)) {
- return;
- }
- if (mStudentModel.deleteStudent(student.getId()) != -1) {
- mStudentView.deleteStudent(student);
- }
- }
- /**
- * 更新学生信息
- *
- * @param student
- */
- public void updateStudent(Student student) {
- if (student == null) {
- return;
- }
- if (mStudentModel.updateStudent(student) != -1) {
- mStudentView.updateStudent(student);
- }
- }
- }
最后看主界面MainActivity
- package com.example.mvpdemo;
- import java.util.ArrayList;
- import java.util.List;
- import com.dandy.adapter.StudentAdapter;
- import com.dandy.bean.Student;
- import com.dandy.presenter.StudentPresenter;
- import com.dandy.util.AppUtil;
- import com.dandy.view.IStudentView;
- import android.app.Activity;
- import android.app.Dialog;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemLongClickListener;
- import android.widget.EditText;
- import android.widget.ListView;
- public class MainActivity extends Activity implements IStudentView,OnClickListener,OnItemLongClickListener{
- private StudentPresenter mStudentPresenter;
- private EditText name,age,sex;
- private ListView studentList;
- private List<Student> mStudents = new ArrayList<Student>();
- private StudentAdapter mStudentAdapter;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mStudentPresenter = new StudentPresenter(this, this);
- findViewById(R.id.insert).setOnClickListener(this);
- findViewById(R.id.query).setOnClickListener(this);
- findViewById(R.id.copy).setOnClickListener(this);
- name = (EditText) findViewById(R.id.name);
- age = (EditText) findViewById(R.id.age);
- sex = (EditText) findViewById(R.id.sex);
- studentList = (ListView) findViewById(R.id.student_list);
- mStudentAdapter = new StudentAdapter(this, mStudents, R.layout.student_info_item_layout);
- studentList.setAdapter(mStudentAdapter);
- studentList.setOnItemLongClickListener(this);
- }
- /**
- * implements IStudentView
- */
- @Override
- public void showAllStudents(List<Student> students) {
- mStudents.clear();
- mStudents.addAll(students);
- mStudentAdapter.notifyDataSetChanged();
- }
- @Override
- public void deleteStudent(Student student) {
- mStudentPresenter.loadAllStudent();
- }
- @Override
- public void updateStudent(Student student) {
- mStudentPresenter.loadAllStudent();
- }
- @Override
- public String getName() {
- return name.getText().toString();
- }
- @Override
- public String getAge() {
- return age.getText().toString();
- }
- @Override
- public String getSex() {
- return sex.getText().toString();
- }
- @SuppressWarnings("deprecation")
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.insert:
- mStudentPresenter.saveStudentInfo();
- break;
- case R.id.query:
- mStudentPresenter.loadAllStudent();
- break;
- case R.id.copy:
- AppUtil.copyDataBaseToSD();
- break;
- }
- }
- /**
- * 实现listView的item长按事件的回调方法
- */
- @Override
- public boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {
- final Student student = mStudents.get(position);
- final Dialog dialog = new Dialog(this, R.style.DialogStyle);
- dialog.setContentView(R.layout.student_edit_layout);
- dialog.show();
- dialog.findViewById(R.id.delete).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- mStudentPresenter.deleteStudent(student);
- dialog.cancel();
- }
- });
- dialog.findViewById(R.id.update).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- mStudentPresenter.updateStudent(student);
- dialog.cancel();
- }
- });
- dialog.findViewById(R.id.cancle).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- dialog.cancel();
- }
- });
- return true;
- }
- }
另外在看看通用的adapter的使用
ViewHolder
- package com.dandy.adapter;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.drawable.Drawable;
- import android.text.SpannableString;
- import android.util.SparseArray;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.CompoundButton;
- import android.widget.ImageView;
- import android.widget.TextView;
- public class ViewHolder{
- private final SparseArray<View> mViews;
- private int mPosition;
- private View mConvertView;
- private int itemViewType;
- private ViewHolder(Context context, ViewGroup parent, int layoutId,int position,int itemViewType) {
- this.mPosition = position;
- this.itemViewType = itemViewType;
- this.mViews = new SparseArray<View>();
- this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,false);
- // setTag
- this.mConvertView.setTag(this);
- }
- /**
- * 拿到一个ViewHolder对象
- * @param context
- * @param convertView
- * @param parent
- * @param layoutId
- * @param position
- * @return
- */
- public static ViewHolder get(Context context, View convertView,ViewGroup parent, int layoutId, int position,int itemViewType) {
- if (convertView == null) {
- return new ViewHolder(context, parent, layoutId, position,itemViewType);
- }
- ViewHolder viewHolder = (ViewHolder) convertView.getTag();
- if(viewHolder != null && viewHolder.getItemViewType() == itemViewType){
- return viewHolder;
- }else{
- viewHolder = null;
- }
- return viewHolder;
- }
- public int getItemViewType() {
- return itemViewType;
- }
- public View getConvertView() {
- return this.mConvertView;
- }
- /**
- * 通过控件的Id获取对于的控件,如果没有则加入views
- * @param viewId
- * @return
- */
- @SuppressWarnings("unchecked")
- public <T extends View> T getView(int viewId) {
- View view = mViews.get(viewId);
- if (view == null) {
- view = mConvertView.findViewById(viewId);
- mViews.put(viewId, view);
- }
- return (T) view;
- }
- /**
- *通过控件的Id控制控件是否显示
- * @param viewId
- * @param visibility
- */
- public void setVisibility(int viewId,int visibility){
- View view = getView(viewId);
- view.setVisibility(visibility);
- }
- /**
- *通过控件的Id控制控件是否可点击
- * @param viewId
- * @param visibility
- */
- public void setClickable(int viewId,boolean clickable){
- View view = getView(viewId);
- view.setClickable(clickable);
- }
- /**
- * 为TextView设置字符串
- * @param viewId
- * @param charSequence
- * @param visible
- * @return
- */
- public void setText(int viewId, CharSequence charSequence) {
- TextView view = getView(viewId);
- view.setText(charSequence);
- }
- public void setText(int viewId, SpannableString text) {
- TextView view = getView(viewId);
- view.setText(text);
- }
- public void setImageBitmap(int viewId, Bitmap bm){
- ImageView view = getView(viewId);
- if(view != null && bm != null){
- view.setImageBitmap(bm);
- }
- }
- public void setImageDrawable(int viewId, Drawable draw){
- ImageView view = getView(viewId);
- if(view != null && draw != null){
- view.setImageDrawable(draw);
- }
- }
- /**
- *
- */
- public void setEnable(int viewId, boolean enable){
- View view = getView(viewId);
- view.setEnabled(enable);
- }
- public void setChecked(int viewId, boolean checked){
- CompoundButton cb = getView(viewId);
- cb.setChecked(checked);
- }
- public int getPosition() {
- return mPosition;
- }
- }
CommonAdapter
- package com.dandy.adapter;
- import java.util.Arrays;
- import java.util.List;
- import android.content.Context;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- /**
- * 抽象类
- * 通用的adapter适配器
- */
- public abstract class CommonAdapter<T> extends BaseAdapter{
- public Context mContext;
- private List<T> mDatas;
- private int [] itemLayoutIds;
- private int [] viewTypes;
- private static final int defaultViewType = 0x00;
- /**
- *
- * @param context 环境
- * @param mDatas 数据源
- * @param itemLayoutId 对应布局格式的布局数量--本例只有1个
- */
- public CommonAdapter(Context context, List<T> mDatas, int itemLayoutId) {
- this.mContext = context;
- this.mDatas = mDatas;
- //布局格式数量--及其对应布局格式的布局数量本例都为1
- this.itemLayoutIds = new int[1];
- this.viewTypes = new int[1];
- //获取本例的布局格式、及其对应布局格式的布局数量
- this.itemLayoutIds[0] = itemLayoutId;
- this.viewTypes[0] = defaultViewType;
- }
- /**
- *
- * @param context 环境变量
- * @param mDatas 数据源
- * @param itemLayoutIds 对应布局格式的布局数量
- * @param viewTypes 布局格式数量
- */
- public CommonAdapter(Context context, List<T> mDatas,int [] itemLayoutIds,int [] viewTypes) {
- this.mContext = context;
- this.mDatas = mDatas;
- this.itemLayoutIds = itemLayoutIds;
- this.viewTypes = viewTypes;
- }
- @Override
- public int getCount() {
- return mDatas.size();
- }
- @Override
- public T getItem(int position) {
- return mDatas.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- //返回你有多少个不同的布局
- @Override
- public int getViewTypeCount() {
- return viewTypes.length;
- }
- /**
- * 多种布局格式需要重写此方法
- *
- * 因为 The item view type you are returning from getItemViewType() is >= getViewTypeCount(),
- * 所以type的最大值最好从0开始,然后++
- */
- public int getItemViewType(int position,int [] viewTypes){
- return defaultViewType;
- };
- /**
- *
- */
- @Override
- public int getItemViewType(int position) {
- return getItemViewType(position,viewTypes);
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- int viewType = getItemViewType(position);
- int index = Arrays.binarySearch(viewTypes, viewType);
- ViewHolder viewHolder = getViewHolder(position, convertView,parent,itemLayoutIds[index],viewType);
- convert(viewHolder, getItem(position),viewType, position);
- return viewHolder.getConvertView();
- }
- public abstract void convert(ViewHolder viewHolder, T item,int itemViewType, int position);
- private ViewHolder getViewHolder(int position, View convertView,ViewGroup parent,int layoutId,int itemViewType) {
- return ViewHolder.get(mContext, convertView, parent,layoutId,position,itemViewType);
- }
- }
StudentAdapter
- package com.dandy.adapter;
- import java.util.List;
- import android.content.Context;
- import com.dandy.bean.Student;
- import com.example.mvpdemo.R;
- public class StudentAdapter extends CommonAdapter<Student>{
- public StudentAdapter(Context context, List<Student> mDatas,int itemLayoutId) {
- super(context, mDatas, itemLayoutId);
- }
- @Override
- public void convert(ViewHolder viewHolder, Student item, int itemViewType,int position) {
- String sex = "";
- if(item.getSex().equals("0")){
- sex = "男";
- }else{
- sex = "女";
- }
- viewHolder.setText(R.id.student_info, item.getName()+"_"+item.getAge()+"_"+sex);
- }
- }
activity_main.xml
- <LinearLayout 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"
- android:orientation="vertical" >
- <EditText
- android:id="@+id/name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:hint="请输入姓名" />
- <EditText
- android:id="@+id/age"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:hint="请输入年龄"
- android:inputType="number"/>
- <EditText
- android:id="@+id/sex"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:hint="请输入性别:0(男)1(女)"
- android:inputType="number"
- android:digits="0,1"/>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:orientation="horizontal" >
- <Button
- android:id="@+id/insert"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="插入" />
- <Button
- android:id="@+id/query"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dp"
- android:text="查找" />
- <Button
- android:id="@+id/copy"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dp"
- android:text="拷贝" />
- </LinearLayout>
- <ListView
- android:id="@+id/student_list"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
student_info_item_layout
- <?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="match_parent"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/student_info"
- android:layout_width="match_parent"
- android:layout_height="40dp"
- android:gravity="center_vertical"
- android:paddingLeft="20dp"
- android:text="dandy:24:男" />
- </LinearLayout>
student_edit_layout
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="210dp"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/update"
- style="@style/StudentEditStyle"
- android:background="@drawable/selector_item_back_top"
- android:text="更新" />
- <TextView
- android:id="@+id/delete"
- style="@style/StudentEditStyle"
- android:background="@drawable/selector_item_back_center"
- android:text="删除" />
- <TextView
- android:id="@+id/cancle"
- style="@style/StudentEditStyle"
- android:background="@drawable/selector_item_back_bottom"
- android:text="取消" />
- </LinearLayout>
style.xml 就是定义dialog的样式的
- <style name="CenterStyle">
- <item name="android:gravity">center</item>
- </style>
- <style name="SizeStyle" parent="CenterStyle">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">50dp</item>
- </style>
- <style name="StudentEditStyle" parent="SizeStyle">
- <item name="android:textSize">16sp</item>
- <item name="android:textColor">#111111</item>
- </style>
- <style name="DialogStyle">
- <item name="android:windowFrame">@null</item> <!-- 边框 -->
- <item name="android:windowIsFloating">true</item> <!-- 是否浮现在activity之上 -->
- <item name="android:windowIsTranslucent">true</item> <!-- 半透明 -->
- <item name="android:windowNoTitle">true</item> <!-- 无标题 -->
- <item name="android:windowBackground">@android:color/transparent</item> <!-- 背景透明 -->
- <item name="android:backgroundDimEnabled">true</item> <!-- 模糊 -->
- </style>
更新的
selector_item_back_top.xml
- <?xml version="1.0" encoding="utf-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/layer_rect_top_corner_press" android:state_pressed="true"/>
- <item android:drawable="@drawable/layer_rect_top_corner_normal" android:state_pressed="false"/>
- <item android:drawable="@drawable/layer_rect_top_corner_normal"/>
- </selector>
- <?xml version="1.0" encoding="utf-8"?>
- <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:bottom="@dimen/devider">
- <shape android:shape="rectangle">
- <corners android:topLeftRadius="@dimen/corner" android:topRightRadius="@dimen/corner"
- android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
- <solid android:color="@color/color_press" />
- <stroke android:width="@dimen/devider" android:color="@color/color_devider" />
- </shape>
- </item>
- </layer-list>
- <?xml version="1.0" encoding="utf-8"?>
- <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:bottom="@dimen/devider">
- <shape android:shape="rectangle">
- <corners android:topLeftRadius="@dimen/corner" android:topRightRadius="@dimen/corner"
- android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
- <solid android:color="@color/color_white" />
- <stroke android:width="@dimen/devider" android:color="@color/color_devider" />
- </shape>
- </item>
- </layer-list>
删除
- <?xml version="1.0" encoding="utf-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true">
- <shape android:shape="rectangle">
- <corners android:radius="0dp" />
- <solid android:color="@color/color_press" />
- <stroke android:width="@dimen/devider" android:color="@color/color_devider" />
- </shape>
- </item>
- <item android:state_pressed="false">
- <shape android:shape="rectangle">
- <corners android:radius="0dp" />
- <solid android:color="@color/color_white" />
- <stroke android:width="@dimen/devider" android:color="@color/color_devider" />
- </shape>
- </item>
- <item>
- <shape android:shape="rectangle">
- <corners android:radius="0dp" />
- <solid android:color="@color/color_white" />
- <stroke android:width="@dimen/devider" android:color="@color/color_devider" />
- </shape></item>
- </selector>
取消
- <?xml version="1.0" encoding="utf-8"?>
- <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:top="@dimen/devider">
- <shape android:shape="rectangle">
- <corners android:bottomLeftRadius="@dimen/corner" android:bottomRightRadius="@dimen/corner"
- android:topLeftRadius="0dp" android:topRightRadius="0dp"/>
- <solid android:color="@color/color_press" />
- <stroke android:width="@dimen/devider" android:color="@color/color_devider" />
- </shape>
- </item>
- </layer-list>
- <?xml version="1.0" encoding="utf-8"?>
- <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:top="@dimen/devider">
- <shape android:shape="rectangle">
- <corners android:bottomLeftRadius="@dimen/corner" android:bottomRightRadius="@dimen/corner"
- android:topLeftRadius="0dp" android:topRightRadius="0dp"/>
- <solid android:color="@color/color_white" />
- <stroke android:width="@dimen/devider" android:color="@color/color_devider" />
- </shape>
- </item>
- </layer-list>
- <resources>
- <!-- Default screen margins, per the Android Design guidelines. -->
- <dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
- <dimen name="corner">10dp</dimen>
- <dimen name="devider">0.01dp</dimen>
- <dimen name="textSize1">12sp</dimen>
- </resources>
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <color name="color_devider">#cccccc</color>
- <color name="color_white">#ffffff</color>
- <color name="color_press">#e5e5e5</color>
- </resources>