2013-01-21 40 views
2

我有两个活动 - 一个显示来自SQLite的数据,另一个在那里添加数据。我可以用标签在它们之间切换。问题是,如果我添加一个新项目,我不知道如何刷新列表,因为它在不同的活动类中,我无法在添加类中访问它。这怎么解决?添加新的不同活动后刷新SQLite列表

这里是我的两个类:

列表:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_1); 

    final ShoppingSQL shoppingSQL = new ShoppingSQL(this); 
    final List<ShoppingData> list = shoppingSQL.getAll(); 

    final ArrayAdapter<ShoppingData> adapter = new ArrayAdapter<ShoppingData>(
      this, android.R.layout.simple_list_item_1, list); 
    setListAdapter(adapter); 

    this.getListView().setLongClickable(true); 
     this.getListView().setOnItemLongClickListener(new OnItemLongClickListener() { 
      public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) { 
       shoppingSQL.delete((int)list.get(position).getId()); 
       adapter.remove(list.get(position)); 
       adapter.notifyDataSetChanged(); 
       return true; 
      } 
     }); 
} 

地址:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_2); 
} 

public void ButtonOnClick(View v) { 
    ShoppingSQL shoppingSQL = new ShoppingSQL(this); 

    ShoppingData data = new ShoppingData(); 
    data.setName("test"); 

    shoppingSQL.add(data); 

    Dialog d = new Dialog(this); 
    d.setTitle("Added!"); 
    d.show(); 
} 

我也有一点sidequestion。在我的第一个(列表)活动中,当我在“onLongClick”中访问它们时,Eclipse使每个变量都是最终的 - 为什么是这样并且可以避免?此外,对于我应该关注什么以及如何让我的代码更好或者我犯的任何其他错误发表任何评论都会非常好。

+0

使用cursor.setNotificationUri,contentResolver.notifyChange,也许cursor.registerContentChangeObserver – njzk2

+0

从匿名类访问时,您需要变量最终或更广泛的范围。通常,您可以拥有这些实例成员。或者,您可能会注意到id是作为参数提供的(不需要获取(位置).getId,并且适配器也被传递。您可以将其转换为避免参考其他引用。 – njzk2

+0

有添加活动触发一个事件,并让另一个拿起这个效果并刷新? – Zlatko

回答

2

我会保持简单。只需将添加类的意图发送到List类,然后您的列表将再次使用新项目填充。

+0

我把这个添加: 意图我=新的意图(这,FirstActivity.class); startActivity(i); 它工作。将我的背部送回列表并重新加载所有内容。谢谢! :) – user1985273

+0

至少使用本地BroadcastManager。否则,由于进程间通信而产生很多开销。 – Dan

+0

Intent intent = new Intent(); intent.setAction(“de.vogella.android.mybroadcast”); sendBroadcast(intent); 是否这样? – user1985273

1

你想要使用的是连接到你的SQLite DB的CursorLoader(见http://developer.android.com/reference/android/content/CursorLoader.html)。然后,您可以使用适配器与CursorLoader同步的ListView。这通过使用侦听器模式自动完成(或多或少)。

在添加数据的活动中,您需要通知所有监听者数据已更改。通常,您通过致电notifyChange(请参阅http://developer.android.com/reference/android/content/ContentResolver.html#notifyChange%28android.net.Uri,%20android.database.ContentObserver,%20boolean%29)来完成此操作。

您可能还想考虑实现自己的内容提供者。

+1

也谢谢你,我必须表示我不明白你说了什么,而且soulreaver的anwser对我来说更简单,但仍然非常感谢你的努力。当我更好的在Java /机器人,并确定它会帮我:) – user1985273

+0

CursorLoaders是Andoids标准模式用于监听底层数据源的变化。对于一个很好和清晰的代码,你应该阅读一些关于这个主题的教程。它真的帮助我了解发生了什么。 – Dan