页面的布局样式如下:
先看数据库部分
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>