2012-12-02 77 views
0

當我在應用程序中更深入的其他活動並按向上按鈕以返回到原始活動時,使用sqlite存儲的我應用程序中保存的數據不會顯示。保存的數據在返回到活動時不顯示

這裏是listcaptivity充氣的listfragment。

請注意,我將查詢放入onCreate中,以便在返回活動時再次執行該查詢。

package com.example.sample; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Build; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

import com.actionbarsherlock.app.SherlockListFragment; 

/** 
* A list fragment representing a list of Courses. This fragment also supports 
* tablet devices by allowing list items to be given an 'activated' state upon 
* selection. This helps indicate which item is currently being viewed in a 
* {@link CourseDetailFragment}. 
* <p> 
* Activities containing this fragment MUST implement the {@link Callbacks} 
* interface. 
*/ 
public class CourseListFragment extends SherlockListFragment { 

SQLiteDatabase db; 
DbHelper dbHelper; 
boolean bool = false; 

private static String courseName; 
ArrayList<String> courseItems; 
ArrayAdapter<String> adapter; 
/** 
* The serialization (saved instance state) Bundle key representing the 
* activated item position. Only used on tablets. 
*/ 
private static final String STATE_ACTIVATED_POSITION = "activated_position"; 

/** 
* The fragment's current callback object, which is notified of list item 
* clicks. 
*/ 
private Callbacks mCallbacks = sDummyCallbacks; 

/** 
* The current activated item position. Only used on tablets. 
*/ 
private int mActivatedPosition = ListView.INVALID_POSITION; 

/** 
* A callback interface that all activities containing this fragment must 
* implement. This mechanism allows activities to be notified of item 
* selections. 
*/ 
public interface Callbacks { 
    /** 
    * Callback for when an item has been selected. 
    */ 
    public void onItemSelected(String id); 
} 

/** 
* A dummy implementation of the {@link Callbacks} interface that does 
* nothing. Used only when this fragment is not attached to an activity. 
*/ 
private static Callbacks sDummyCallbacks = new Callbacks() { 
    @Override 
    public void onItemSelected(String id) { 
    } 
}; 

/** 
* Mandatory empty constructor for the fragment manager to instantiate the 
* fragment (e.g. upon screen orientation changes). 
*/ 
public CourseListFragment() { 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    dbHelper = new DbHelper(getActivity()); 
    db = dbHelper.getReadableDatabase(); 
    courseItems = new ArrayList<String>(); 
    int layout = (Build.VERSION.SDK_INT >= 11) ? android.R.layout.simple_list_item_activated_1 
      : android.R.layout.simple_list_item_1; 
    adapter = new ArrayAdapter<String>(getActivity(), layout, courseItems); 
    // TODO: replace with a real list adapter. 
    setListAdapter(adapter); 

    if (bool) { 
     String[] projection = { DbHelper.COURSE_NAME }; 
     Cursor c = db.query(DbHelper.TABLE_NAME, projection, null, null, 
       null, null, null); 
     c.moveToFirst(); 

     while (c.moveToNext()) { 
      courseName = c 
        .getString(c.getColumnIndex(DbHelper.COURSE_NAME)); 
      courseItems.add(courseName); 
     } 
     c.close(); 
     adapter.notifyDataSetChanged(); 
    } 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // Restore the previously serialized activated item position. 
    if (savedInstanceState != null 
      && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { 
     setActivatedPosition(savedInstanceState 
       .getInt(STATE_ACTIVATED_POSITION)); 
    } 
} 

public void addCourse() { 
    String[] projection = { DbHelper.COURSE_NAME }; 
    Cursor c = db.query(DbHelper.TABLE_NAME, projection, null, null, null, 
      null, null); 
    c.moveToFirst(); 

    while (c.moveToNext()) { 
     courseName = c.getString(c.getColumnIndex(DbHelper.COURSE_NAME)); 
     courseItems.add(courseName); 
    } 
    c.close(); 
    adapter.notifyDataSetChanged(); 
    bool = true; 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    // Activities containing this fragment must implement its callbacks. 
    if (!(activity instanceof Callbacks)) { 
     throw new IllegalStateException(
       "Activity must implement fragment's callbacks."); 
    } 

    mCallbacks = (Callbacks) activity; 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 

    // Reset the active callbacks interface to the dummy implementation. 
    mCallbacks = sDummyCallbacks; 
} 

@Override 
public void onListItemClick(ListView listView, View view, int position, 
     long id) { 
    super.onListItemClick(listView, view, position, id); 
    // Notify the active callbacks interface (the activity, if the 
    // fragment is attached to one) that an item has been selected. 
    mCallbacks.onItemSelected(null); 

} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    if (mActivatedPosition != ListView.INVALID_POSITION) { 
     // Serialize and persist the activated item position. 
     outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); 
    } 
} 

/** 
* Turns on activate-on-click mode. When this mode is on, list items will be 
* given the 'activated' state when touched. 
*/ 
public void setActivateOnItemClick(boolean activateOnItemClick) { 
    // When setting CHOICE_MODE_SINGLE, ListView will automatically 
    // give items the 'activated' state when touched. 
    getListView().setChoiceMode(
      activateOnItemClick ? ListView.CHOICE_MODE_SINGLE 
        : ListView.CHOICE_MODE_NONE); 
} 

public void setActivatedPosition(int position) { 
    if (position == ListView.INVALID_POSITION) { 
     getListView().setItemChecked(mActivatedPosition, false); 
    } else { 
     getListView().setItemChecked(position, true); 
    } 

    mActivatedPosition = position; 
} 
} 

編輯更新的onoviewstaterestored

package com.example.sample; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Build; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

import com.actionbarsherlock.app.SherlockListFragment; 

/** 
* A list fragment representing a list of Courses. This fragment also supports 
* tablet devices by allowing list items to be given an 'activated' state upon 
* selection. This helps indicate which item is currently being viewed in a 
* {@link CourseDetailFragment}. 
* <p> 
* Activities containing this fragment MUST implement the {@link Callbacks} 
* interface. 
*/ 
public class CourseListFragment extends SherlockListFragment { 

SQLiteDatabase db; 
DbHelper dbHelper; 
boolean bool = false; 

private static String courseName; 
ArrayList<String> courseItems; 
ArrayAdapter<String> adapter; 
/** 
* The serialization (saved instance state) Bundle key representing the 
* activated item position. Only used on tablets. 
*/ 
private static final String STATE_ACTIVATED_POSITION = "activated_position"; 

/** 
* The fragment's current callback object, which is notified of list item 
* clicks. 
*/ 
private Callbacks mCallbacks = sDummyCallbacks; 

/** 
* The current activated item position. Only used on tablets. 
*/ 
private int mActivatedPosition = ListView.INVALID_POSITION; 

/** 
* A callback interface that all activities containing this fragment must 
* implement. This mechanism allows activities to be notified of item 
* selections. 
*/ 
public interface Callbacks { 
    /** 
    * Callback for when an item has been selected. 
    */ 
    public void onItemSelected(String id); 
} 

/** 
* A dummy implementation of the {@link Callbacks} interface that does 
* nothing. Used only when this fragment is not attached to an activity. 
*/ 
private static Callbacks sDummyCallbacks = new Callbacks() { 
    @Override 
    public void onItemSelected(String id) { 
    } 
}; 

/** 
* Mandatory empty constructor for the fragment manager to instantiate the 
* fragment (e.g. upon screen orientation changes). 
*/ 
public CourseListFragment() { 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    dbHelper = new DbHelper(getActivity()); 
    db = dbHelper.getReadableDatabase(); 
    courseItems = new ArrayList<String>(); 
    int layout = (Build.VERSION.SDK_INT >= 11) ? android.R.layout.simple_list_item_activated_1 
      : android.R.layout.simple_list_item_1; 
    adapter = new ArrayAdapter<String>(getActivity(), layout, courseItems); 
    // TODO: replace with a real list adapter. 
    setListAdapter(adapter); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // Restore the previously serialized activated item position. 
    if (savedInstanceState != null 
      && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { 
     setActivatedPosition(savedInstanceState 
       .getInt(STATE_ACTIVATED_POSITION)); 
    } 
} 

@Override 
public void onViewStateRestored(Bundle savedInstanceState) { 
    super.onViewStateRestored(savedInstanceState); 
    String[] projection = { DbHelper.COURSE_NAME }; 
    Cursor c = db.query(DbHelper.TABLE_NAME, projection, null, null, null, 
      null, null); 
    c.moveToFirst(); 

    while (c.moveToNext()) { 
     courseName = c.getString(c.getColumnIndex(DbHelper.COURSE_NAME)); 
     courseItems.add(courseName); 
    } 
    c.close(); 
    adapter.notifyDataSetChanged(); 
} 


@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    // Activities containing this fragment must implement its callbacks. 
    if (!(activity instanceof Callbacks)) { 
     throw new IllegalStateException(
       "Activity must implement fragment's callbacks."); 
    } 

    mCallbacks = (Callbacks) activity; 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 

    // Reset the active callbacks interface to the dummy implementation. 
    mCallbacks = sDummyCallbacks; 
} 

@Override 
public void onListItemClick(ListView listView, View view, int position, 
     long id) { 
    super.onListItemClick(listView, view, position, id); 
    // Notify the active callbacks interface (the activity, if the 
    // fragment is attached to one) that an item has been selected. 
    mCallbacks.onItemSelected(null); 

} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    if (mActivatedPosition != ListView.INVALID_POSITION) { 
     // Serialize and persist the activated item position. 
     outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); 
    } 
} 

/** 
* Turns on activate-on-click mode. When this mode is on, list items will be 
* given the 'activated' state when touched. 
*/ 
public void setActivateOnItemClick(boolean activateOnItemClick) { 
    // When setting CHOICE_MODE_SINGLE, ListView will automatically 
    // give items the 'activated' state when touched. 
    getListView().setChoiceMode(
      activateOnItemClick ? ListView.CHOICE_MODE_SINGLE 
        : ListView.CHOICE_MODE_NONE); 
} 

public void setActivatedPosition(int position) { 
    if (position == ListView.INVALID_POSITION) { 
     getListView().setItemChecked(mActivatedPosition, false); 
    } else { 
     getListView().setItemChecked(position, true); 
    } 

    mActivatedPosition = position; 
} 
} 

回答

0

我定了!我不得不使用最初使用的addCourse方法更新列表視圖,然後在每次使用onViewStateRestored方法恢復活動時更新它。就方法內部而言,它們都包含相同的內容。

下面是我的工作列表片段的代碼。

package com.example.sample; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Build; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

import com.actionbarsherlock.app.SherlockListFragment; 

/** 
* A list fragment representing a list of Courses. This fragment also supports 
* tablet devices by allowing list items to be given an 'activated' state upon 
* selection. This helps indicate which item is currently being viewed in a 
* {@link CourseDetailFragment}. 
* <p> 
* Activities containing this fragment MUST implement the {@link Callbacks} 
* interface. 
*/ 
public class CourseListFragment extends SherlockListFragment { 

SQLiteDatabase db; 
DbHelper dbHelper; 
boolean bool = false; 

private static String courseName; 
ArrayList<String> courseItems; 
ArrayAdapter<String> adapter; 
/** 
* The serialization (saved instance state) Bundle key representing the 
* activated item position. Only used on tablets. 
*/ 
private static final String STATE_ACTIVATED_POSITION = "activated_position"; 

/** 
* The fragment's current callback object, which is notified of list item 
* clicks. 
*/ 
private Callbacks mCallbacks = sDummyCallbacks; 

/** 
* The current activated item position. Only used on tablets. 
*/ 
private int mActivatedPosition = ListView.INVALID_POSITION; 

/** 
* A callback interface that all activities containing this fragment must 
* implement. This mechanism allows activities to be notified of item 
* selections. 
*/ 
public interface Callbacks { 
    /** 
    * Callback for when an item has been selected. 
    */ 
    public void onItemSelected(String id); 
} 

/** 
* A dummy implementation of the {@link Callbacks} interface that does 
* nothing. Used only when this fragment is not attached to an activity. 
*/ 
private static Callbacks sDummyCallbacks = new Callbacks() { 
    @Override 
    public void onItemSelected(String id) { 
    } 
}; 

/** 
* Mandatory empty constructor for the fragment manager to instantiate the 
* fragment (e.g. upon screen orientation changes). 
*/ 
public CourseListFragment() { 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    dbHelper = new DbHelper(getActivity()); 
    db = dbHelper.getReadableDatabase(); 
    courseItems = new ArrayList<String>(); 
    int layout = (Build.VERSION.SDK_INT >= 11) ? android.R.layout.simple_list_item_activated_1 
      : android.R.layout.simple_list_item_1; 
    adapter = new ArrayAdapter<String>(getActivity(), layout, courseItems); 
    // TODO: replace with a real list adapter. 
    setListAdapter(adapter); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // Restore the previously serialized activated item position. 
    if (savedInstanceState != null 
      && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { 
     setActivatedPosition(savedInstanceState 
       .getInt(STATE_ACTIVATED_POSITION)); 
    } 
} 

@Override 
public void onViewStateRestored(Bundle savedInstanceState) { 
    super.onViewStateRestored(savedInstanceState); 
    String[] projection = { DbHelper.COURSE_NAME }; 
    Cursor c = db.query(DbHelper.TABLE_NAME, projection, null, null, null, 
      null, null); 
    c.moveToFirst(); 

    while (c.moveToNext()) { 
     courseName = c.getString(c.getColumnIndex(DbHelper.COURSE_NAME)); 
     courseItems.add(courseName); 
    } 
    c.close(); 
    adapter.notifyDataSetChanged(); 
} 

public void addCourse() { 
    String[] projection = { DbHelper.COURSE_NAME }; 
    Cursor c = db.query(DbHelper.TABLE_NAME, projection, null, null, null, 
      null, null); 
    c.moveToFirst(); 

    while (c.moveToNext()) { 
     courseName = c.getString(c.getColumnIndex(DbHelper.COURSE_NAME)); 
     courseItems.add(courseName); 
    } 
    c.close(); 
    adapter.notifyDataSetChanged(); 
    bool = true; 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    // Activities containing this fragment must implement its callbacks. 
    if (!(activity instanceof Callbacks)) { 
     throw new IllegalStateException(
       "Activity must implement fragment's callbacks."); 
    } 

    mCallbacks = (Callbacks) activity; 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 

    // Reset the active callbacks interface to the dummy implementation. 
    mCallbacks = sDummyCallbacks; 
} 

@Override 
public void onListItemClick(ListView listView, View view, int position, 
     long id) { 
    super.onListItemClick(listView, view, position, id); 
    // Notify the active callbacks interface (the activity, if the 
    // fragment is attached to one) that an item has been selected. 
    mCallbacks.onItemSelected(null); 

} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    if (mActivatedPosition != ListView.INVALID_POSITION) { 
     // Serialize and persist the activated item position. 
     outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); 
    } 
} 

/** 
* Turns on activate-on-click mode. When this mode is on, list items will be 
* given the 'activated' state when touched. 
*/ 
public void setActivateOnItemClick(boolean activateOnItemClick) { 
    // When setting CHOICE_MODE_SINGLE, ListView will automatically 
    // give items the 'activated' state when touched. 
    getListView().setChoiceMode(
      activateOnItemClick ? ListView.CHOICE_MODE_SINGLE 
        : ListView.CHOICE_MODE_NONE); 
} 

public void setActivatedPosition(int position) { 
    if (position == ListView.INVALID_POSITION) { 
     getListView().setItemChecked(mActivatedPosition, false); 
    } else { 
     getListView().setItemChecked(position, true); 
    } 

    mActivatedPosition = position; 
} 
} 
相關問題