Android---MVP设计模式高级(三)
来源:互联网 发布:js对象 编辑:程序博客网 时间:2024/05/22 17:48
点击打开链接,下载demo即可。。。
Android---MVP设计模式初级(一)
Android---MVP设计模式中级(二)
页面的布局样式如下:
先看数据库部分
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);}/** * 创建数据库 */@Overridepublic void onCreate(SQLiteDatabase db) {createTables(db);}/** * 数据库升级回调方法 */@Overridepublic 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-->V2if (upgradeVersion == 1) {upgradeTables1(db);upgradeVersion = 2;}// V2-->V3if (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;@Overridepublic 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;}@Overridepublic 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;@Overrideprotected 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 */@Overridepublic void showAllStudents(List<Student> students) {mStudents.clear();mStudents.addAll(students);mStudentAdapter.notifyDataSetChanged();}@Overridepublic void deleteStudent(Student student) {mStudentPresenter.loadAllStudent();}@Overridepublic void updateStudent(Student student) {mStudentPresenter.loadAllStudent();}@Overridepublic String getName() {return name.getText().toString();}@Overridepublic String getAge() {return age.getText().toString();}@Overridepublic String getSex() {return sex.getText().toString();}@SuppressWarnings("deprecation")@Overridepublic 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长按事件的回调方法 */@Overridepublic 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() {@Overridepublic void onClick(View v) {mStudentPresenter.deleteStudent(student);dialog.cancel();}});dialog.findViewById(R.id.update).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mStudentPresenter.updateStudent(student);dialog.cancel();}});dialog.findViewById(R.id.cancle).setOnClickListener(new OnClickListener() {@Overridepublic 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);// setTagthis.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;//布局格式数量--及其对应布局格式的布局数量本例都为1this.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;}@Overridepublic int getCount() {return mDatas.size();}@Overridepublic T getItem(int position) {return mDatas.get(position);}@Overridepublic long getItemId(int position) {return position;}//返回你有多少个不同的布局@Overridepublic 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;};/** * */@Overridepublic int getItemViewType(int position) {return getItemViewType(position,viewTypes);}@Overridepublic 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);}@Overridepublic 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>
0 0
- Android---MVP设计模式高级(三)
- Android---MVP设计模式高级(三)
- Android MVP 设计模式
- Android: MVP设计模式
- Android MVP 设计模式
- <Android 基础(三)> MVP模式
- Android---MVP设计模式初级(一)
- Android---MVP设计模式中级(二)
- 浅谈Android MVP 设计模式 (下)
- Android之mvp设计模式(二)
- Android 设计模式之 MVP(一)
- android设计模式(MVC MVP MVVM)
- android MVP设计模式实践
- Android的MVP设计模式
- Android中的MVP设计模式
- Android之mvp设计模式
- 关于Android MVP设计模式
- Android MVP设计模式浅析
- USG双击热备配置
- HDU2004---成绩转换
- 纯后处理的volumetric light
- 移植USB无线网卡到mini2440(TP-LINK的TL-WN721N,使用的芯片型号是rtl8192cu)
- 七个你无法忽视的 Git 使用技巧
- Android---MVP设计模式高级(三)
- maven出现JAVA_HOME is set to an invalid directory.
- 求余运算转换为位运算
- Shell之预启动脚本
- phpstorm常用快捷键
- P-MOS管做开关管用
- 从SUMO的输出文件中获得队列转移矩阵
- 黑马程序员——OC学习——类方法和匿名类
- 人的不同目的