每次我使用SimpleCursorAdapter在ListView中启动应用程序时,项目都会重复

时间:2011-12-02 18:08:07

标签: android android-listview simplecursoradapter

ListView 正在使用 Cursor 中的项目填充 SimpleCursorAdapter ,但每次打开应用程序时这些项目都是重新添加到列表视图中不断增加它。当我使用 SimpleAdapter 时,我会这样做:

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(null) cursor.close()等等,但没有效果......

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

感谢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();
    }

}

2 个答案:

答案 0 :(得分:2)

嗯,这条线是可疑的:

  

如果这很重要,我在这个活动的onCreate()中填充数据库,但是我也尝试从其他活动填充它,我得到了listview的相同行为。

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

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

答案 1 :(得分: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类。确保每次启动应用程序时都不要在数据库中重新插入项目。我可能会混淆您的问题,列表视图或数据库中的项目是重复的。我非常确定您每次运行应用程序时都会重新插入数据。