내에서 사용하기 위해 노력하고있어 위한 방법 하지만 나를 위해 작동하지 않습니다.Android Application
notifyDataSetChanged()
ArrayAdapter
내가 발견 여기에 대답은 , notifyDataSetChanged()
메인 스레드에서 실행해야합니다,하지만에 대한 예는 없었다.
누구든지 예제를 보내거나 적어도 링크를 보낼 수 있습니까?!
내에서 사용하기 위해 노력하고있어 위한 방법 하지만 나를 위해 작동하지 않습니다.Android Application
notifyDataSetChanged()
ArrayAdapter
내가 발견 여기에 대답은 , notifyDataSetChanged()
메인 스레드에서 실행해야합니다,하지만에 대한 예는 없었다.
누구든지 예제를 보내거나 적어도 링크를 보낼 수 있습니까?!
답변:
를 들어 ArrayAdapter
, notifyDataSetChanged
당신이 사용하는 경우에만 작동합니다 add()
, insert()
, remove()
, 및 clear()
어댑터에.
를 구성 할 때 전달 된 ArrayAdapter
참조에 대한 참조를 보유합니다 List
. List
활동의 멤버 인에 전달하고 나중에 해당 활동 멤버를 변경하는 경우 ArrayAdapter
여전히 원본에 대한 참조를 보유합니다 List
. 어댑터가 List
활동에서 변경 한 것을 알 수 없습니다 .
당신의 선택은 :
ArrayAdapter
기본 목록을 수정 ( add()
, insert()
, remove()
, clear()
, 등)ArrayAdapter
새 List
데이터로를 다시 작성하십시오 . 많은 리소스와 가비지 수집을 사용합니다.BaseAdapter
하고 ListAdapter
그 기본으로 변경 할 수 있습니다 List
데이터 구조.notifyDataSetChanged()
목록이 업데이트 될 때마다 사용하십시오 . UI-Thread에서 호출하려면 runOnUiThread()
of를 사용하십시오 Activity
. 그런 다음 notifyDataSetChanged()
작동합니다.notifyDataSetChanged()
가 그런 식으로 부르면 ((BaseAdapter) arrayAdapter).notifyDataSetChanged();
어떨까요?
runOnUiThread()
다음과 같은 방법을 사용할 수 있습니다 . 를 사용하지 않는 경우 ListActivity
코드를 조정하여에 대한 참조를 얻으십시오 ArrayAdapter
.
final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});
나는 최근 에이 주제에 대해 썼지 만이 게시물은 오래되었지만 BaseAdapter.notifyDataSetChanged()
단계별로 올바른 방법으로 구현하는 방법을 알고 싶은 사람에게 도움이 될 것이라고 생각했습니다 .
Android 또는 최신 블로그 BaseAdapter.notifyDataSetChanged () 에서 BaseAdapter.notifyDataSetChanged ()를 올바르게 구현하는 방법을 참조하십시오 .
mItem.add()
와 같은 하나의 요소를 mItem.get(position).setImage(encodedImage)
편집했습니다. add (), clear (), remove () 등 만 해당
나는 같은 문제가 있었고 전체 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);
}
}
}
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); } }
. 이제 새 어댑터 클래스에서 확장하십시오.
나는 이것이 늦은 응답이라는 것을 알고 있지만 비슷한 문제에 직면하고 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
합니다.
누군가가 이것을 유용하게 사용하기를 바랍니다!