您的位置:首页 > 移动开发 > Android开发

Android---MVP设计模式高级(三)

2016-06-03 10:49 736 查看
原文地址:http://blog.csdn.net/u013210620/article/details/50116753

点击打开链接,下载demo即可。。。

Android---MVP设计模式初级(一)

Android---MVP设计模式中级(二)

页面的布局样式如下:







先看数据库部分



DataBaseHelper这个类主要做的事情是:创建数据库、数据库表

[java] view
plain copy

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 这个类的方法是提供了数据库关闭,打开的操作

[java] view
plain copy

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

[java] view
plain copy

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

[java] view
plain copy

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--这个类的作用是:提供一些业务方法

[java] view
plain copy

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

[java] view
plain copy

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

[java] view
plain copy

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

[java] view
plain copy

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

[java] view
plain copy

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

[java] view
plain copy

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

[java] view
plain copy

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

[java] view
plain copy

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

[java] view
plain copy

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

[html] view
plain copy

<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

[html] view
plain copy

<?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

[html] view
plain copy

<?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的样式的

[html] view
plain copy

<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

[html] view
plain copy

<?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>

[html] view
plain copy

<?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>

[html] view
plain copy

<?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>

删除

[html] view
plain copy

<?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>

取消

[html] view
plain copy

<?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>

[html] view
plain copy

<?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>

尺寸

[html] view
plain copy

<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>

颜色

[html] view
plain copy

<?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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: