2011-12-02 3 views
0

ListView에 내가 SimpleCursorAdapter에 전달하는 커서 느릅 나무에서 항목으로 채우는되어있는 ListView에있는 응용 프로그램을 시작하지만 때마다 나는이 항목을 다시있는 응용 프로그램을 열 때마다 복제된다 목록보기에 추가되어 계속 증가하고 있습니다. 내가 SimpleAdapter를 사용할 때, 나는 같은 것을 할 :항목은 내가 SimpleCursorAdapter는

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

하지만 지금, 나는 데이터베이스 내용을 삭제하지 않기 때문에 방법 :

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); 

, 내 문제를 해결 다음 수행 SimpleCursorAdapter이 있으면 해결할 수 있습니까? 이 같은 : 지금은 setListAdapter (널) 또는 cursor.close(), 그리고 많은 다른,하지만 efect에도 시도했다

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

...

이 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

귀하가 제시 한 코드에 문제가 없습니다 .. 귀하의 데이터가 "하드 코딩 된"것이므로 매번 데이터베이스에 저장하는 것이 좋습니다. db 헬퍼 클래스 또는 onCreate 아래에서 메서드를 호출하는 곳을 살펴보십시오. 코드를 게시 할 수 없다면 .. – Joe

답변

2

음,이 라인은 용의자 : 그것은 중요 않으면

, 나는이 활동의에서 onCreate()에서 데이터베이스를 채우는 해요,하지만 난 또한 그것을 채우기 위해 노력했다 다른 활동에서 나는 listview를 위해 동일한 행동을 얻는다.

데이터베이스 호출을 채우는 데 데이터베이스가 이미 채워져 있는지 확인합니까?

커서가 가리키는 DB에 계속 추가하는 것처럼 들리는 것 같습니다.

+0

아니요, 저는 아닙니다 .... 회신을보고, 나는 if와 함께 뭔가를 사용하려고했습니다. 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: 문제가 데이터베이스 클래스 인 경우. 응용 프로그램을 시작할 때마다 데이터베이스에 항목을 다시 삽입하지 않도록하십시오. 문제가 섞여서 목록보기 나 데이터베이스에 항목이 중복되는 경우가 있습니다. 앱을 실행할 때마다 데이터를 다시 삽입하고 있음을 확신합니다.

+0

Nop, 해결하지 못했습니다. 나는 또한이 메소드에서'dbmet = new DataBaseMethods (this)'를 제거하려고 시도했다. 앱을 시작할 때마다 삽입하는 경우, 앱을 시작하지 않으려 고합니다. 그러나 어떻게해야할지 모르겠습니다. 여기서 삽입 할 유일한 곳은'onCreate()'입니다.이 3 코드 줄을 추가하지 않으면 데이터가 없을 것이므로 테스트를 마쳤습니다. 어떤 충고? – AlexAndro