0

現在のアプリケーションには、sqlite DB からデータを取得して表示する Listview があります。DB の最初の列のデータがリストビューに表示され、クリックすると、最初の列に関連付けられた残りの列を表示するアクティビティが開始されます。データが編集されると、DB は更新されますが、アプリケーションを再起動しない限り、リストビューには更新が表示されません。onResume メソッドに startActivityForResult() を実装しようとしていますが、うまくいきません。DB の更新後にリストビューを更新しようとしています。どうすればこれを達成できますか。

ListView アクティビティ:

@Override 
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login_listview);


    loginList = (ListView)
   findViewById(R.id.loginlist);
    loginList.setOnItemClickListener(this);

    webLogin = (Button)
   findViewById(R.id.button3);
    webLogin.setOnClickListener(this);

    loginArrayList = new ArrayList<LoginDetails>();

    loginListAdapter = new ArrayAdapter<String>(this,   android.R.layout.simple_list_item_1, populateList());
    loginList.setAdapter(loginListAdapter);
}

@Override
public void onClick (View v) {
    Intent webLoginIntent = new Intent (this, LoginPlusActivity.class);
    startActivity(webLoginIntent);
}

public List<String> populateList (){

    List<String> webNameList = new ArrayList<String>();

    dataStore openHelperClass = new dataStore (this);

    SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase();

    Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null);

    startManagingCursor(cursor);

    while (cursor.moveToNext()){

    String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE));
    String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS));
    String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME));
    String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD));
    String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES));

    LoginDetails lpDetails = new LoginDetails();

        lpDetails.setsName(sName);
        lpDetails.setwUrl(wUrl);
        lpDetails.setuName(uName);
        lpDetails.setpWord(pWord);
        lpDetails.setlNotes(lNotes);

        loginArrayList.add(lpDetails);
        webNameList.add(sName);
}

sqliteDatabase.close();
return webNameList;
}



@Override
protected void onResume() {
    super.onResume();

    Intent i = new Intent(LoginList.this, UpdateDeleteLoginList.class);
    LoginList.this.startActivityForResult(i, 1);    
    loginList.setAdapter(loginListAdapter);

loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
loginList.setAdapter(loginListAdapter);

}

アクティビティの更新:

     @Override
public void onClick(View v){

    loginSitetext = sName.getText().toString();
    loginAddresstext = wUrl.getText().toString();
    loginUsertext = uName.getText().toString();
    loginpassWordtext = pWord.getText().toString();
    loginNotestext = lNotes.getText().toString();

    LoginDetails loginDetails = new LoginDetails();

    loginDetails.setsName(bundledWebSite);
    loginDetails.setwUrl(bundledWebAddress);
    loginDetails.setuName(bundledUserName);
    loginDetails.setpWord(bundledPassWord);
    loginDetails.setlNotes(bundledNotes);

    if(v.getId()==R.id.rucBttn){
        finish();

    }else if(v.getId()==R.id.ruuBttn){
        updateLoginDetails(loginDetails);

        Intent returnIntent = new Intent();
        setResult(RESULT_CANCELED, returnIntent);
        finish();

    }else if(v.getId()==R.id.rudBttn){
        deleteLoginDetails(loginDetails);
    }

}


private void updateLoginDetails(LoginDetails loginDetails){

    dataStore androidOpenDbHelper = new dataStore(this);

    SQLiteDatabase sqliteDatabase = androidOpenDbHelper.getWritableDatabase();

    ContentValues contentValues = new ContentValues();

    contentValues.put(dataStore.COLUMN_NAME_SITE, loginSitetext);
    contentValues.put(dataStore.COLUMN_NAME_ADDRESS, loginAddresstext);
    contentValues.put(dataStore.COLUMN_NAME_USERNAME, loginUsertext);
    contentValues.put(dataStore.COLUMN_NAME_PASSWORD, loginpassWordtext);
    contentValues.put(dataStore.COLUMN_NAME_NOTES, loginNotestext);

    String[] whereClauseArgument = new String[1];
    whereClauseArgument[0] = loginDetails.getsName();

    System.out.println("whereClauseArgument[0] is :" + whereClauseArgument[0]);

    sqliteDatabase.update(dataStore.TABLE_NAME_INFOTABLE, contentValues, dataStore.COLUMN_NAME_SITE+"=?", whereClauseArgument);

    sqliteDatabase.close();
    finish();
4

2 に答える 2

1

アダプターで notifyDataSetUpdated を呼び出すことにより、リストビューを更新できます。これにより、リストビュー全体が強制的に更新され、それを更新するすべてのビューで getView が呼び出されます。

于 2013-01-16T02:51:07.073 に答える
0

あなたが尋ねている問題には標準的な解決策があります。それは (残念ながら) 数行のコードよりも複雑です。これは、 Content ProviderData Loader、およびCursor Adapterの組み合わせによって実現されます。

すべてのコンポーネントを含むスケルトンを持ち、必要なことを達成するために変更できる小さなデモをGitHubに置きました。また、タブレット (および新しい携帯電話も) で 1 ペイン/2 ペインのレイアウトを処理します。

コンテンツ プロバイダーは、データベース テーブルへのインターフェイスとして機能し、ListView に変更について通知するモジュールであり、リストの即時更新を処理します。「 getContentResolver().notifyChange()」呼び出しをgrep するだけで、リストが更新されます。データへのすべてのアクセス (CRUD - クエリ、挿入、削除、更新など) にコンテンツ プロバイダーを使用している限り、すべてのアクションはすぐに ListView に反映されます。

これについては、 Wolfram RittmeyerLars VogelAlex Lockwoodなどによる多くの情報があります。

幸運を

于 2015-04-22T03:41:35.487 に答える