2012-01-10 2 views
6

나는이 시간에 너무 많은 시간을 낭비하여 다시 물어야합니다. 왜 이런 일이 전혀 일어나는지 모르겠습니다.배열 어댑터 notifyDataSetChanged()가 작동하지 않습니다.

배열 어댑터 (aAdapter) 및 배열 목록 (aList)이 있는데 데이터베이스의 항목을 지우고 목록을 지우는 데 지우는 단추를 넣으려고합니다.

public void clearDB(View view) { 
    aList.clear(); 
    aAdapter.notifyDataSetChanged(); 
    HighScoresDB hsdb = new HighScoresDB(HighScoresActivity.this); 
    hsdb.openDB(); 
    hsdb.clearDB(); 
    hsdb.closeDB(); 

} 

그것은 다른 곳에 생각에서 작동합니다

내 문제는 여기에 내 onlick 방법 내부에서 NotifyDataSetChanged() 단지 실 거예요 작업이다. 난 다른 메서드에서 명확하고 notifyDataSetChanged() 시도하고 그것을 호출했지만 그 중 하나를 작동하지 않지만 onCreate ....에서 호출 할 때 작동하지 않았다.

어떤 아이디어?

p.s. 데이터베이스가 지워지고 있습니다.

+0

'notifyDataSetChanged()'대신'notifyDataSetInvalidated()'를 시도해 보셨습니까? – edthethird

+0

데이터베이스가있는 경우 CursorAdapter를 사용하는 것이 좋습니다. 마법입니다! notifyDataSetChanaged()를 수행 할 필요없이 데이터베이스를 변경하고 모든 것을 독자적으로 업데이트했다는 것을 알 수 있습니다. – MinceMan

답변

12

먼저 Android 어댑터 구현에 매우 결함이 있음을 발견했습니다. 별다른 것을 수행하는 것에 관해서는 그것을 사용하는 방법에 대한 모호한 설명이있는 것으로 보이며, 공식 문서는 그것들을 분명히하지 않습니다. 나는 이것으로 틀리게 입증하게 아주 행복 할.

는 뷰에서 편집 데이터로 살 때 일관된 결과를 가지고하는 방법은 다음과

:

  • 당신이 변화하는 것들과 마찬가지로 감각을 만드는 AsyncTask에서 수행되어야한다되게되는 기본 데이터 구조에 대한 모든 변경을 UI 스레드 및 동시성 문제가 싶지 않아. 당신이 ListAdapter이 그래서 만약 기본 데이터 구조에

  • 작업은 다음이 add, remove하고 목록 어댑터의 clear를 사용하는 어댑터 메서드를 호출하여 수행해야합니다. 이것은 어댑터가보기 통지 등을 관리한다는 것을 의미합니다. 이는 일반적으로 사용 가능한 메소드가 제한되어 있으므로 사용자 정의 어댑터를 작성해야하는 결과를 낳습니다 (7 이전의 sdk 버전에는 모두 추가하지 않음). 당신은 또한 큰 fat controller 역할을하는 어댑터로 끝나지 만, 안드로이드를 MVC 패턴으로 보지 말아야한다는 것을 알고 있지만 여전히 틀린 것처럼 보입니다.

  • 내가 기본 데이터 구조에서 작동하도록 어댑터 호출을 우회하여보기에 대한 알림을 단단히 관리하지 않으면 결과가 모두 정상적으로 끝난 앱을 만들었습니다. 이제 어댑터를 통해 호출합니다.

그래서 나는 당신의 onClick 방법에 특별히 작동하지 않습니다 notifiyDataSetChanged에 이유를 설명 할 수 없다 생각하지만. 잘하면 앱이 예상대로 작동하도록하는 데 도움이되는 유용한 정보를 제공하고 있습니다.

+0

모든 정보를 제공해 주셔서 감사합니다. 안타깝게도 이것은 유니 유니트 (uni assignment)를위한 것입니다. 내일 휴가가 될 때 시간이 없어서 지금은 눈이 먼 제안을 시도 할 것입니다. 그러나 제가 이것을 건네 준 후에 시장에 발표 할 예정입니다. 그 전에는 여러분의 아이디어 중 일부를 시도 할 것입니다. :) –

+2

나는 동의한다, whatsthebeef! 문서화 된 기능을 제공한다고하더라도 항상 작동한다는 것을 보장 할 수 없기 때문에 특정 "문서화 된 기능"을 더 이상 사용하지 않습니다. 사실, 나는 이전에 고슴도치의 문제에 빠져 있었고, notifydatachanged()도 사용하지 않았습니다. :(나는 단지 내 이벤트 핸들러를 만든다. 슬픈 일이다. **이 주석은 SDK가 아닌 안드로이드 어댑터와 관련이있다. ** –

9

귀찮지는 않지만, 알림을 표시하지 않고 어댑터를 다시 초기화 할 수 있습니다. 가끔씩 어댑터를 작동시키는 유일한 방법을 보았습니다.

+0

나는 이것을 시험해 볼 것이다, 고마워. :) –

+1

이것은 내가 스스로 청소할 수있는 유일한 방법이기도합니다. –

+0

어댑터를 다시 초기화하면 효과가있는 유일한 해결책이라는 것을 알았습니다! 고마워요 – Sahil

2

이와 비슷한 문제를 처리 한 방법은 기본적으로 blindstuff와 마찬가지로 어댑터를 다시 초기화하는 것입니다.

public class Example extends Activity{ 
     CustomAdapter adapter; 
     ArrayList<ArrayList<String>> info = new ArrayList<ArrayList<String>>(); 
     final ListView list = (ListView) findViewById(R.id.listView_custom); 
     adapter = new CustomAdapter(this, diceInfo.get(id)); 
     list.setAdapter(adapter); 

그런 다음 온 클릭 리스너

add.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       info.get(id).add("1,0,0,true"); 
       adapter = new CustomAdapter(Example.this, info.get(id)); 
       list.setAdapter(adapter); 
      } 
     }); 

의 예는 모든 초기화하지 않고이 점에 가져옵니다. 난 그냥 새 어댑터를 만들고 내가 가지고있는 목록보기로 설정합니다. 잘 작동합니다.

0

또한 대화 상자에서 사용될 때 어댑터의 이상한 동작이 발생했습니다. LogCat 또는 Eclipse 디버깅에서 어댑터가 업데이트되거나 (기본 구조 - 양방향) notifiyDataSetChanged 대화 상자가 오류 또는 기타 추적없이 사라집니다. 어댑터가 정상적인 활동 (ListView)에 적용되면 정확히 똑같은 코드가 제대로 작동합니다.

0

I이 스레드가 더 이상 활성화되지 생각하지만, 나중에 참조 :

따르면, developer.android.com

[onNotifyDataSetChanged()]에 통지 기본 데이터가 변경되었는지 첨부 참관인 데이터 세트를 반영하는 뷰는 자체적으로 새로 고쳐 져야합니다. 다시 대신 어댑터 그냥 adapter.clear()와 adapter.add()를 사용하여 데이터를 업데이트 자체를 새로보기를 이야기하고 listView.setAdapter (어댑터)를 호출하여 업데이트 할 목록보기 강제 갖는

.