Android 刷新頁面更新數據方法探究

寫一個股票記錄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界面時, 此方法自動調用
*/
@Override

protected 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();
    }

對於效率,感覺還行,刷新頻率不高,還有待改進的地方以後接着寫。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章