Android(安卓)刷新页面更新数据方法探究
16lz
2021-01-26
写一个股票记录APP,月目标数据可弹出一个Dialog进行修改。
但返回后发现数据没变,TextView也没变,原来代码是在 确定 的button内绑定数据更新代码
//本月目标对话框 private void targetDialog(){ final EditText dialogTV=new EditText(MainActivity.this); dialogTV.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL); AlertDialog.Builder targetD=new AlertDialog.Builder(MainActivity.this); targetD.setView(dialogTV); targetD.setTitle("修改本月目标"); targetD.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if(TextUtils.isEmpty(dialogTV.getText())){ Toast.makeText(MainActivity.this,"Input can not empty.",Toast.LENGTH_SHORT).show(); }else { float mtarget=Float.parseFloat(dialogTV.getText().toString().trim()); /* 存入mTarget*/ try{ MyDataBaseHelper helper=new MyDataBaseHelper(MainActivity.this); SQLiteDatabase db=helper.getWritableDatabase(); ContentValues cv=new ContentValues(); cv.put(COLUMN_MONTHDATA_MTARGET,mtarget); db.update(TABLE_MONTHDATA,cv,"mYear=? and mMonth=?",new String[]{MainJumpYear,MainJumpMonth}); Toast.makeText(MainActivity.this,"insert"+mtarget+MainJumpYear+MainJumpMonth,Toast.LENGTH_SHORT).show(); //db.execSQL("UPDATE monthdata set mTarget="+mtarget+" WHERE mYear="+MainJumpYear+" and mMonth="+MainJumpMonth); db.close(); }catch (SQLException e){ Toast.makeText(MainActivity.this,"SQL wrong",Toast.LENGTH_SHORT).show(); } } } }).show(); }
后来找到问题所在,MainActivity是一个singleTask的活动,我在onPause()内绑定了把页面数据更新的函数returnSave():
//退出时保存数据或输入新mTarget保存 private void returnSave(){ try{ dbHelper=new MyDataBaseHelper(this); SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase(); ContentValues contentValues=new ContentValues(); contentValues.put("mTarget",mTartget.getText().toString()); sqLiteDatabase.update("monthdata",contentValues,"mYear=? and mMonth=?",new String[]{MainJumpYear,MainJumpMonth}); sqLiteDatabase.close(); contentValues.clear(); }catch (SQLiteException e){ } }
因此就算数据库内数据更新了,一跳转后,数据又被改回去了。因而我选择一种折中方法,直接修改TextView的值,等跳转时就可以修改数据了。但问题又来了,光修改TextView,里面的其他数据不会变动,看起来就很别扭,如何刷新当前数据呢?
查了下相关的做法,找了三种:
1.手动刷新activity界面的数据:在activity类下增加一个refresh()方法
注意这种刷新方法只适用于只有一个activity的实例
public void refresh() {onCreate(null);}
2.刷新另一个activity界面数据(自动刷新):
在涉及到刷新的activity类下重写onResume()方法
/*** 调用onCreate(), 目的是刷新数据, 从另一activity界面返回到该activity界面时, 此方法自动调用*/@Overrideprotected void onResume() {super.onResume();onCreate(null); }
3.先保存saveInstanceState,再刷新页面
//刷新另一个activity界面数据: public Bundle s; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.s = savedInstanceState;
对于第一种,无法使用,可能因为Activity比较多,第二种太频繁,第三种未尝试,感觉也不太好用。
还是自己想办法,想到TextView修改了,直接刷新数据就行了,就把returnSave()做到button里,然后再直接跳到onResume(),把数据Cursor更新放到onResume()里,问题解决了。本来想放到onRestart()内,但是这样就多了不少代码。
修改后的Dialog代码:
//本月目标对话框 private void targetDialog(){ final EditText dialogTV=new EditText(MainActivity.this); dialogTV.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL); AlertDialog.Builder targetD=new AlertDialog.Builder(MainActivity.this); targetD.setView(dialogTV); targetD.setTitle("修改本月目标"); targetD.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if(TextUtils.isEmpty(dialogTV.getText())){ Toast.makeText(MainActivity.this,"Input can not empty.",Toast.LENGTH_SHORT).show(); }else { mTartget.setText(dialogTV.getText()); //存入数据 returnSave(); //刷新页面数据,onResume()内重新加载数据 onResume(); } } }).show(); }
对于效率,感觉还行,刷新频率不高,还有待改进的地方以后接着写。
更多相关文章
- android日记-
- 【073】Android(安卓)数据存储(SQLite)
- Android(安卓)ViewPager事件滑动监听修改
- Android(安卓)ListView字母索引(仿微信通讯录列表)
- 一起学android opengl之光照
- Android设置锁屏/休眠时长
- Android(安卓)ContentProvider共享数据
- Android(安卓)Studio Git 修改用户名、密码、URL
- Android(安卓)O中修改NotificationChannel 属性,升级app后该修改