2014-02-27 74 views
0

我知道有关于这个问题的帖子很多,我想我已经阅读它们,但没有帮助我......列表视图不更新插入

我有一个活动的一个ListView它填充了一个游标从一个数据库,这一切工作正常。

然后我在屏幕上有一个按钮,开始一个新的活动,用户可以在列表中添加一个新的条目。

完成此操作后,将重新显示第一个活动,但最近添加的条目不在列表中。如果我停下并重新启动应用程序,则新条目将正确显示。

我试过了几个变化 - 没有产生任何错误。

这是我的主要代码:

public class FirstScreenActivity extends ListActivity { 

public static String TAG = "My App:"; 

//This is the Adapter being used to display the list's data 
public SimpleCursorAdapter vehAdapter; 

    static final String[] PROJECTION = new String[] {dbMain.ENTRY_ID, dbMain.VEHICLE_NAME}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Create/prepare database 
    mpgDBHelper mpgDBhelp = new mpgDBHelper(this.getBaseContext()); 
    SQLiteDatabase mpgDB = mpgDBhelp.getWritableDatabase(); 

    //Display vehicles available - first get any entries 

    Cursor mpgCur = mpgDB.query(dbMain.TABLE_NAME, PROJECTION, null, null, null, null, null); 

    // build a listView 
    String[] fromColumns = {dbMain.VEHICLE_NAME}; 
    int[] toViews = {android.R.id.text1}; 

    vehAdapter = new SimpleCursorAdapter(this, 
       android.R.layout.simple_list_item_1, mpgCur, fromColumns, toViews, 0); 
    setListAdapter(vehAdapter); 
    setContentView(R.layout.activity_first_screen); 
} 

public void createNewVeh(View view) { 
    // create intent to start another activity 
    Intent newVehIntent = new Intent(this, createNewVehicleActivity.class); 

    startActivity(newVehIntent); 

    // I have tried putting the update lines here but also did not work 
} 

@Override 
public void onResume() { 

    super.onResume(); 

     Log.v(TAG, "In onResume...about to reset list"); 

    // Refresh ListAdaptor 
     //vehAdapter.getCursor(); <-- this doesn't work either 
    vehAdapter.notifyDataSetChanged(); 

} 

在对其他活动的代码,我只是用:

finish(); 

...数据库后插入。

我从onResume获取日志消息 - 有什么建议吗?

+2

我认为最好在startActivityForResult中更新onActivityResult方法而不是onResume()中的适配器。你试过了吗? – Micer

+0

我没有 - 为什么更好? – Nelmo

+1

方法'onResume()'也被称为锁定和解锁手机之后,这种情况下,当你不需要更新数据库中的数据时,因为它们可能没有改变。 – Micer

回答

3

改变的数据之后,应该再次获得光标,然后使用当前的光标交换,然后通知更改适配器:

Cursor mpgCur = mpgDB.query(dbMain.TABLE_NAME, PROJECTION, null, null, null, null, null); 
vehAdapter.swapCursor(mpgCur); 
vehAdapter.notifyDataSetChanged(); 

有没有必要再次创建适配器。

+0

啊,好吧,这有点整洁,非常感谢... – Nelmo

0

我认为你的光标没有更新,尽管数据已经改变。您可能会重新查询(即进行另一个查询并获得新的Cursor实例)。

+0

但是我使用链接到游标的特殊列表适配器 - 根据教程,整个问题的关键是让您只指示游标重新查询,并且一切都会为您完成。是的,我可以编写自己的代码来执行查询并每次重新显示,但肯定错过了这一点? – Nelmo

+0

我明白,但我也知道'Cursor.requery()'已弃用。所以,即使这种方法实际上可以完成它的工作,但它不会使用它的良好做法;) –

2

这是因为您正在使用onCreate方法运行列表初始化。只要将这个部分:

Cursor mpgCur = mpgDB.query(dbMain.TABLE_NAME, PROJECTION, null, null, null, null, null); 

// build a listView 
String[] fromColumns = {dbMain.VEHICLE_NAME}; 
int[] toViews = {android.R.id.text1}; 

vehAdapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, mpgCur, fromColumns, toViews, 0); 
setListAdapter(vehAdapter); 

onResume()

+0

我希望列表在应用程序启动后立即显示 - 是onResume调用的吗?如果是这样,我只是重新讨论并每次重新宣布一切 - 似乎效率很低? – Nelmo

+0

是的,onResume在应用程序启动时调用权利 – birdy

+0

好的,这是可行的 - 非常感谢,尽管我对此不满意 - 根据Android教程,似乎我正在手动执行listAdapter应该自动执行的操作。 – Nelmo