5

だから私は奇妙な問題を抱えています。私が取り組んでいる2つの活動があります。アクティビティの1つは、database.queryのWHERE句を介して結果をフェッチするために使用する長いExtraIを介してデータが取得されるListViewを表示します。他のアクティビティは、ListViewアイテムがクリックされたときに呼び出され、誰かがListViewのデータベースに何かを追加できるようにします。

アクティビティ名はDaysActivity.java、(リストビューを使用するアクティビティ)およびDayAddActivity.java(誰かが1日を追加できるようにするアクティビティで、DaysActivity.javaリストビューに表示されます)です。

私が抱えている問題は、finish() DayAddActivity.java戻ってDaysActivityもListViewがまだ完全に入力されていることです。ただし、[戻る]ボタンDayAddActivity.java(アプリアイコンが表示されたアクションバーのタイトルの左側にあるボタン)を押すと、DaysActivity.javaに戻ると、ListViewが空になります。

両方のコードは次のとおりです。

DaysActivity.java:

package com.gauvion.gfit;

import android.annotation.SuppressLint;
import android.app.ListActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class DaysActivity extends ListActivity {

    private DaysDataSource datasource;
    private SimpleCursorAdapter dataAdapter;
    private boolean isEditing = false;
    private Toast toast_deleted;
    private String[] columns = new String[] { MySQLiteHelper.COLUMN_NAME, MySQLiteHelper.COLUMN_DAY };
    private int[] to;
    private long routineDataID;
    private String routineDataName;

    @SuppressLint("ShowToast")
    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_days); 

        routineDataID = getIntent().getLongExtra("routineDataID", 0);
        routineDataName = getIntent().getStringExtra("routineDataName");
        setTitle(routineDataName);

        toast_deleted = Toast.makeText(this, "", Toast.LENGTH_SHORT);
        datasource = new DaysDataSource(this);
        datasource.open();

        Cursor cursor = datasource.fetchAllDays(routineDataID);
        to = new int[] { R.id.listitem_day_name, R.id.listitem_day_day };
        dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day, cursor, columns, to, 0);
        setListAdapter(dataAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {     
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_days, menu);
        return true;        
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {     
        Cursor cursor = datasource.fetchAllDays(routineDataID);
        switch (item.getItemId()) {
        case R.id.button_days_add:
            Intent startDayAdd = new Intent(this, DayAddActivity.class);
            startDayAdd.putExtra("routineDataID", routineDataID);
            this.startActivity(startDayAdd);
            return true;

        case R.id.button_days_edit:
            to = new int[] { R.id.listitem_day_edit_name, R.id.listitem_day_edit_day };
            dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day_edit, cursor, columns, to, 0);
            setListAdapter(dataAdapter);

            isEditing = true;
            invalidateOptionsMenu();
            return true;

        case R.id.button_days_edit_done:
            to = new int[] { R.id.listitem_day_name, R.id.listitem_day_day };
            dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day, cursor, columns, to, 0);
            setListAdapter(dataAdapter);

            isEditing = false;
            invalidateOptionsMenu();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        menu.findItem(R.id.button_days_edit).setVisible(!isEditing);
        menu.findItem(R.id.button_days_edit_done).setVisible(isEditing);

        return true;
    }

    @Override
    protected void onResume() {
        datasource.open();
        Cursor cursor = datasource.fetchAllDays(routineDataID);
        dataAdapter.changeCursor(cursor);

        super.onResume();
    }

    @Override
    protected void onPause() {
        datasource.close();
        super.onPause();
    }

} 

DayAddActivity.java:

package com.gauvion.gfit;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import android.support.v4.app.NavUtils;

public class DayAddActivity extends Activity {
    private RoutinesDataSource datasource;
    private EditText dayName;
    private Spinner dayDay;
    private Button saveButton;
    private long routineDataID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_day_add);
        routineDataID = getIntent().getLongExtra("routineDataID", 0);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_day_add, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void cancelDay(View view) {
        this.finish();
    }

}

このcancelDay()関数は、で「キャンセル」ボタンがクリックされたときに呼び出されますactivity_day_add.xml。私が言ったように、の内側の「キャンセル」ボタンをクリックすると、DayAddActivity.javaに戻りDaysActivity.java、ListViewは正常です。すべてのデータがあります。ただし、アクションバーの戻るボタン(アクティビティのタイトルの横にある戻る矢印とアプリアイコンを含むボタン)を押すと、ListView forDaysActivity.javaは空/なくなり、タイトルも空になります(これも生成されるため)追加の文字列値を介して)。

4

2 に答える 2

0

カーソルはアクティビティによって管理されていません。これにより、メモリリークやANRが発生する可能性があります。ローダーを使用して、カーソルを使用してリストにデータを取り込むことを検討する必要があります。ここに例があります:http://developer.android.com/guide/components/loaders.html

ローダーは、データベースへの接続が取得されたときにアプリをフリーズせず、アクティビティのあるインスタンスから別のインスタンスに渡されるため、メモリリークを防ぎ、リソースを再利用するため、より適切に機能します。

しかし、繰り返しになりますが、以前の投稿のように:ExtrasはonResume()で失われているようです。アクティビティの将来の自己に引数を渡すには、onSaveInstanceStateとonCreateの間のリンクを理解する必要があります。この投稿を見てください。スコアが最大の回答:onSaveInstanceState()とonRestoreInstanceState()

于 2012-12-26T19:13:44.457 に答える
0

「this.startActivity(startDayAdd);」でコンテキストに問題があるようです。ライン。「DaysActivity.this.startActivity(startDayAdd);」を使用してみてください。それが機能しない場合は、ブレークポイントを使用して行ごとの実行を確認します。

于 2012-12-26T20:03:32.287 に答える