2011-12-02 63 views
0

的ListView与来自光标至极我通过在SimpleCursorAdapter的项目填充一个ListView,但每次我打开应用程序,这些项目是重 - 添加到列表视图不断增加。当我使用SimpleAdapter,我做这样的事情:项目正在复制我启动应用程序与SimpleCursorAdapter

static final ArrayList<HashMap<String, String>> foobar = new 
              ArrayList<HashMap<String,String>>(); 
    SimpleAdapter adapter = new SimpleAdapter(this, foobar, R.layout.list_item, String[] from, int[] to); 
    setListAdapter(adapter); 

做下一个,解决我的问题:

@Override 
    public void onDestroy(){ 
    super.onDestroy(); 
     foobar.removeAll(foobar); 
    } 

但现在,我不想删除数据库的内容,所以如何解决它,如果我有一个SimpleCursorAdapter?像这样的:

> SimpleCursorAdapter myadapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor, String[] from, int[] to); 

我已经试过setListAdapter(空)cursor.close(),和许多其他人,但没有效应...

现在,这些hapen当我退出该应用程序使用设备的“后退”按钮。如果我按下“主页”按钮,当我回来时,我拥有相同数量的项目。因此,每次用“返回”按钮退出时,列表都会重复。

解决感谢Kaediil的答案。评论线是我改进了。孔类:

public class DataBaseActivity extends ListActivity { 

DataBaseMethods dbmet; //is the class that handle database and auxiliar methods working on it 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list); 

    dbmet = new DataBaseMethods(this); 
    Cursor mycursor= dbmet.getItems(); // 1. add new cursor 


    try{ 
      if(!mycursor.moveToFirst()){ //2.check if there are items in the database 
     dbmet.addItems("Daniel","Son","Karate-kid"); 
     dbmet.addItems("Silv", "Stalone", "Terminator"); 
     dbmet.addItems("foo", "bar", "buz"); 
      } // 
      showDatabaseContent(); 
    } 

    finally{ 
     dbmet.close(); 
    } 
} 


public void showDatabaseContent(){ 

    DataBaseMethods dbmet = new DataBaseMethods(this); 
    try{ 

     Cursor cursor = dbmet.getItems(); 
     SimpleCursorAdapter myadapter = new SimpleCursorAdapter(this, R.layout.item_list, cursor, dbmet.FROM, TO); 
     setListAdapter(myadapter); 
    } 
    finally{ 
     dbmet.close(); 
    } 

} 
+0

你的问题不存在于你提交的代码中。我猜你的数据是“硬编码的”,你可能只是简单地将它保存到数据库中。看看你的数据库帮助器类或你在哪里调用它的方法在onCreate ..如果你找不到它发布的代码.. – Joe

回答

2

嗯,这条线是犯罪嫌疑人:

如果它很重要,我填充这个活动的onCreate()的数据库,但我想也填充它从其他活动,我得到了相同的行为为列表视图。

在填充数据库调用时是否检查数据库是否已经填充?

这听起来像你只是不断向光标指向的数据库添加更多副本。

+0

不,我没有....看到你的回复,我试图用'if cursor.isNull(0)'但每次都产生一个索引异常,无论我放什么。有什么建议吗? – AlexAndro

+0

好吧,看着你编辑的代码,你肯定会继续添加到数据库。你(尽管它有点低效)这样做:Cursor cursor = dbmet.getItems(); if(!cur.moveToFirst())如果moveToFirst为空,则返回false。 – Kaediil

+0

它的工作原理:))说实话,我想早点尝试一下,但我被'cur.isNull(0)'沮丧,我没有尝试它,认为它几乎是相同的东西。谢谢!我会用一些评论来更新这个问题,即解决方案可见。 – AlexAndro

0
public void showDatabaseContent(){ 

    DataBaseMethods dbmet = new DataBaseMethods(this); 
    try{ 

     Cursor cursor = dbmet.getItems(); 
     SimpleCursorAdapter myadapter = new SimpleCursorAdapter(this, R.layout.item_list, cursor, dbmet.FROM, TO); 
     setListAdapter(myadapter); 
     -->> myadapter.notifyDataSetChanged(); <<---- 
    } 
    finally{ 
     dbmet.close(); 
    } 


} 

您需要调用notifyDataSetChanged()来发信号通知列表,以使其自身仅与新数据一起失效。

NOTE: 如果问题来自Database类。确保每次启动应用程序时都不要将项目重新插入数据库中。我可能会混淆你的问题,枯萎的项目是在列表视图或数据库中重复。我深信,每次运行应用程序时都会重新插入数据。

+0

Nop,不解决它。我也试图从这个方法中删除'dbmet = new DataBaseMethods(this)',认为它被调用两次。如果我在每次启动应用程序时插入,请确保我不想这样做,但我不知道如何。我插入的唯一位置是'onCreate()',如果我不添加这3个代码行,我将没有数据,我测试了它。有什么建议? – AlexAndro