notifyDataSetChanged 예제


166

내에서 사용하기 위해 노력하고있어 위한 방법 하지만 나를 위해 작동하지 않습니다.Android ApplicationnotifyDataSetChanged()ArrayAdapter

내가 발견 여기에 대답은 , notifyDataSetChanged()메인 스레드에서 실행해야합니다,하지만에 대한 예는 없었다.

누구든지 예제를 보내거나 적어도 링크를 보낼 수 있습니까?!



당신이 확인할 수 있습니다 블로그GitHub의 예도이
Cabezas

답변:


328

를 들어 ArrayAdapter, notifyDataSetChanged당신이 사용하는 경우에만 작동합니다 add(), insert(), remove(), 및 clear()어댑터에.

를 구성 할 때 전달 된 ArrayAdapter참조에 대한 참조를 보유합니다 List. List활동의 멤버 인에 전달하고 나중에 해당 활동 멤버를 변경하는 경우 ArrayAdapter여전히 원본에 대한 참조를 보유합니다 List. 어댑터가 List활동에서 변경 한 것을 알 수 없습니다 .

당신의 선택은 :

  1. 의 기능을 사용하여 ArrayAdapter기본 목록을 수정 ( add(), insert(), remove(), clear(), 등)
  2. ArrayAdapterList데이터로를 다시 작성하십시오 . 많은 리소스와 가비지 수집을 사용합니다.
  3. 자신의 클래스에서 파생 생성 BaseAdapter하고 ListAdapter그 기본으로 변경 할 수 있습니다 List데이터 구조.
  4. notifyDataSetChanged()목록이 업데이트 될 때마다 사용하십시오 . UI-Thread에서 호출하려면 runOnUiThread()of를 사용하십시오 Activity. 그런 다음 notifyDataSetChanged()작동합니다.

13
데이터에 '새'개체를 할당 할 때도주의하십시오. 대신 clear ()를 사용하고 데이터를 다시 채우거나 변경 한 다음 notifyDataSetChanged ()를 호출하십시오.
moonlightcheese

그러나 우리 notifyDataSetChanged()가 그런 식으로 부르면 ((BaseAdapter) arrayAdapter).notifyDataSetChanged();어떨까요?
teoREtik

2
BaseExpandableListAdapter를 사용하는데 add () 또는 remove () 함수가 없으므로 맵을 멤버 변수로 저장합니다. Map을 업데이트하고 notifyDatasetChanged ()를 호출하지만 아무 일도 일어나지 않습니다. 선택 # 4를 사용하면 작동합니다. 왜???
emeraldhieu

사용자 정의 GridView에 ArrayAdapter를 사용하고 있으며 adapter.add (dataReceived)를 호출하여 URL에서 이미지를 가져올 때 이미지를 추가하고 있습니다. 이것은 잘 작동하지만 데이터가 새로 고쳐 지지만 왜 상쾌하고 맨 위로 올라갑니다. 목록을 새로 고치지 않고 추가 할 수 있으므로 항목을 표시하고 싶습니다. (알고 싶은 것은 notifyDatasetChanged ()를 사용하여 안드로이드의 GridView로 작업하는 것입니다) 어떻게이 customGridView (StaggeredGridView)에서 작동하게 할 수 있습니까?
MobileEvangelist 2016 년

1
정렬 방법을 목록에 추가하기 위해 자체 BaseAdapter를 만들려고했지만 어떤 이유로 든 작동하지 않습니다. 정렬 된 배열 목록을 사용하여 전체 어댑터를 다시 작성해도 앱이 느리지는 않지만 여전히 나에게 영향을줍니다. 그래도 쓰레기를 얼마나 많이 만들까요? 비용이 많이 드는 데이터의 실제 배열은 어댑터를 호출하는 활동에서 참조로 유지된다고 가정합니다. 즉, 어댑터 만 수집됩니다.
G_V

34

runOnUiThread()다음과 같은 방법을 사용할 수 있습니다 . 를 사용하지 않는 경우 ListActivity코드를 조정하여에 대한 참조를 얻으십시오 ArrayAdapter.

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});

1
onCreate-method 에서 내 코드에 코드 조각을 추가하려고했지만 (여기에서 stackoverflow.com/questions/3667442/how-to-refresh-adapter 찾을 수 있음 ) 여전히 성공하지 못했습니다. 어쩌면 그것을 추가하기에 잘못된 장소
일까요

1
귀하의 질문은 방금 메소드를 호출하고 기본 UI 스레드에서 메소드를 호출하는 방법을 물었습니다. 이것은 그 질문에 대한 답입니다. 특별한 경우 ( stackoverflow.com/questions/3670500/… ) AsyncTask 및 해당 onPostExecute () 메소드는 고려해야 할 것 같습니다.
Brian

12

나는 최근 에이 주제에 대해 썼지 만이 게시물은 오래되었지만 BaseAdapter.notifyDataSetChanged()단계별로 올바른 방법으로 구현하는 방법을 알고 싶은 사람에게 도움이 될 것이라고 생각했습니다 .

Android 또는 최신 블로그 BaseAdapter.notifyDataSetChanged () 에서 BaseAdapter.notifyDataSetChanged ()를 올바르게 구현하는 방법을 참조하십시오 .


안녕하세요, 첫 번째 링크 예제를 시도했지만 대신 NullPointer 실행 오류가 발생하는 이유 mItem.add()와 같은 하나의 요소를 mItem.get(position).setImage(encodedImage)편집했습니다. add (), clear (), remove () 등 만 해당
Shreekant N

notifyDataSetChanged는 데이터 세트를 편집하거나 수정하는 데 작동합니다. 널 포인터가 다른 이유로 인해 로그를 확인하십시오.
Arif Nadeem

7

나는 같은 문제가 있었고 전체 ArrayAdapter를 새로운 인스턴스로 지속적으로 교체하지 않는 것을 선호합니다. 따라서 AdapterHelper가 다른 곳에서 무거운 작업을 수행하도록했습니다.

일반적으로 알림을 호출하려고하는 곳에 이것을 추가하십시오.

new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();

AdapterHelper 클래스

public class AdapterHelper {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
        arrayAdapter.clear();
        for (Object object : listOfObject){
            arrayAdapter.add(object);
        }
    }
}

내 코드에 다른 ArrayAdapters가 있고 문제없이 작동했습니다. 오늘 밤, SimpleCursorAdapter를 ArrayAdapter로 전환하기로 결정했는데 작동하지 않습니다. 몇 시간 동안 어려움을 겪고 작동하지 않는 이유를 찾으려고 시도한 후 AdapterHelper 클래스를 찾았으며 NOW IT WORKS! 감사!
proudgeekdad

1
이것은 함수에서 쉽게 할 수 있습니다 ... 왜 새로운 클래스를 인스턴스화 하시겠습니까?
techiServices

2
Java 함수에서는 메소드라고합니다. 이 어댑터를 어레이 어댑터와 같은 클래스에서 재사용 할 수있는 방법은 무엇입니까? 또는 목록보기가 포함 된 조각 / 활동입니까? 예, 재사용 할 수있는 클래스에 있습니다. 꼭 정적으로 만들고 싶다면 계속 진행하십시오.
케빈 파커

1
좋은 생각. 또 다른 방법은 ArrayAdapterCompat라는 ArrayAdapter를 확장하고 addAll (..) 메소드를 대체하는 것입니다.이 메소드는 API 11 이후에만 사용 가능하므로 API 레벨을 확인하고 super.addAll(..)API> 11 및 super.add (.. )와 같은 반복과 함께 : if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }. 이제 새 어댑터 클래스에서 확장하십시오.
Konsumierer

완전한! 너무 @Kevin 감사합니다-이것은 내가 필요한 것입니다!
Kibi

3

나는 이것이 늦은 응답이라는 것을 알고 있지만 비슷한 문제에 직면하고 notifyDataSetChanged()있으며 올바른 장소에서 사용하여 문제를 해결할 수 있었습니다.

내 상황은 다음과 같습니다.

완전히 다른 활동에서 반환 된 내용으로 작업 표시 줄 탭 (조각)에서 목록보기를 업데이트해야했습니다. 그러나 처음에는 목록보기에 변경 사항이 반영되지 않았습니다. 그러나 다른 탭을 클릭 한 다음 원하는 탭으로 돌아 가면 다른 활동의 올바른 내용으로 목록보기가 업데이트됩니다. 그래서 이것을 해결하기 위해 notifyDataSetChanged()데이터를 반환 해야하는 활동 코드에서 작업 표시 줄 어댑터를 사용했습니다.

이것은 활동에서 사용한 코드 스 니펫입니다.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) 
    {
        case R.id.action_new_forward:

            FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab
            Intent ina = new Intent(getApplicationContext(), MainActivity.class);
            ina.putExtra("stra", values1);
            startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment).
    }
}

이 활동은에 일부 데이터를 반환하고 FragmentTab2에서 내 목록보기를 직접 업데이트 FragmentTab2합니다.

누군가가 이것을 유용하게 사용하기를 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.