效果图
说明
此篇是我上一篇博文的一些实现细节,如需代码,请移步至此链接
具体内容
1.dialog返回数据
由于dialog与主UI的更新是异步的,要想实现通过dialog返回数据,就必须写一个接口DialogListener,用接口回调的方式返回数据
具体实现是:
1.写一个DialogListener接口,里面有一个sendMessage()方法
public interface DialogListener {
void sendMessage();
}
2.在自定义对话框中添加一个DialogListener接口类型的属性,接收来自构造方法传入的DialogListener对象,并在需要执行sendMessage()方法的地方,执行方法。
/**
省略非关键代码
*/
public class AddDialog extends Dialog {
private DialogListener mListener;
public AddDialog(@NonNull Context context, DialogListener listener) {
super(context);
this.mListener = listener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
mButtonAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//需要使用方法的时候
mListener.sendMessage();
}
});
}
}
3.在主UI中重写接口,并传入dialog的构造方法中
/**
省略非关键代码
*/
public class MainActivity extends AppCompatActivity{
private DialogListener mListener = new DialogListener() {
@Override
public void sendMessage() {
mAdapter.updateView();//点击确定后更新ui
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mButtonAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//传入mListener参数
new AddDialog(MainActivity.this,mListener).show();
}
});
}
}
2 UserDao对象
我遵循了《android编程权威指南3》一书中的写法,具体就是用一个静态变量保存UserDao对象,然后通过一个静态方法获取。这样保证每一次都是相同的UserDao对象。
public class UserDao implements IUserDao{
private static UserDao sUserDao;
private Context mContext;
private SQLiteDatabase mDatabase;
public UserDao(Context context) {
mContext = context.getApplicationContext();
mDatabase = new UserSqlHelper(mContext).getWritableDatabase();//此时数据库才是可写的
}
/**
* 全局保留一个userDao实例
* */
public static UserDao getUserDao(Context context){
if (sUserDao == null){
sUserDao = new UserDao(context);
}
return sUserDao;
}
}
3 数据表的定义
在UserDbSchema这个类中,使用内部类嵌套的方式,保存定义数据库表,列的关系,这样即使在很多很多表的项目中,依旧有迹可循,不会为了繁杂的表,列名字而头疼。
public class UserDbSchema {
//利用内部类定义user表结构
public static final class UserTable{
//定义表名
public static final String TABLE_NAME = "user";
//定义数据表字段
public static final class Columns{
public static final String UUID = "uuid";
public static final String NAME = "name";
public static final String PHONE = "phone";
public static final String ADDRESS = "address";
public static final String SEX = "sex";
}
}
}
4.更新ui界面
可以看到,我每次更新ui都是获取所有用户信息,虽然这样会降低性能,但是在这个小应用中,问题不大,这样写,不管是增删改,都可以公用一个更新ui方法,简化代码。但是,遇到数据繁多的时候,还应当改进,尤其是在改这一方面,可以根据指定uuid进行定点更新,不过这都是后话了。
public void updateView(){
mUsers = UserDao.getUserDao(mContext).getAllUser();
notifyDataSetChanged();
}