Android에서 어댑터 / ListView를 새로 고치는 가장 좋은 방법
내 책 "Hello Android"는 사용자 지정 db 도우미를 사용하고 커서를 설정 한 다음 어댑터를 다음과 같이 설정하는 방법으로이를 제공합니다.
Cursor cursor
CustomDatabaseHelper test = new CustomDatabaseHelper(this);
try {
cursor = getData();
showData(cursor);
} finally {
test.close();
}
그러나 이렇게하면 데이터 세트를 새로 고쳐야 할 때마다이 코드 블록을 계속 실행해야합니다 ( "this"를 사용할 수 없기 때문에 버튼에 대해 onClick () 내부에서 약간 어려워집니다).
이것이 데이터 세트를 새로 고치는 가장 좋은 방법입니까, 아니면 .close를 제거하고 adapter.notifyDataSetChanged ()를 발행해야합니까? 이렇게하면 때때로 강제로 닫히지 만 (현재는 기억할 수 없음) 제대로 삭제할 수없는 경우도 있습니다. 데이터베이스가 현재 열려 있고 다시 열려고하기 때문일 수 있습니다.
모든 함수에 액세스 할 수 있도록 클래스 (OnCreate 외부)의 Cursors, DatabaseHelpers 및 Adapter에 대한 변수도 선언해야합니까?
나는 이것이이 단계에서 단지 형편없는 프로그래밍이라는 것을 알고있다. 그러나 나는 일을하는 가장 좋은 방법에 대한 몇 가지 지침을 얻으려고 노력하고있다.
당신은 사용해야합니다 adapter.notifyDataSetChanged()
. 그것을 사용할 때 로그는 무엇을 말합니까?
설정하기 전에 다음 코드를 추가하기 만하면됩니다 Adapter
.
listView.destroyDrawingCache();
listView.setVisibility(ListView.INVISIBLE);
listView.setVisibility(ListView.VISIBLE);
또는 데이터 자원 변경 후 직접 아래 방법을 사용할 수 있습니다.
adapter.notifyDataSetChanged()
Android에서 어댑터 / ListView를 새로 고치는 가장 좋은 방법
notifyDataSetChanged () 를 호출 할뿐만 아니라 ListView 데이터를 새로 고칠 뿐만 아니라 setAdapter()
정보를 올바르게로드하려면 먼저 호출해야합니다.
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
다음 코드는 나를 위해 완벽하게 작동합니다.
EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter();
adp.UpdateDataList(EfficientAdapter.MY_DATA);
adp.notifyDataSetChanged();
QuickList.invalidateViews();
QuickList.scrollBy(0, 0);
아무 것도 작동하지 않으면 새 결과 세트 또는 업데이트 된 결과 세트로 어댑터 인스턴스를 다시 작성하십시오. 그러면 새보기를 볼 수 있습니다.
XYZAdapter adbXzy = new XYZAdapter(context, 0, listData);
xyzListView.setAdapter(adbXzy);
adbXzy.notifyDataSetChanged();
adapter.notifyDataSetChanged();
LoaderManager를 사용하는 경우 다음 명령문으로 시도하십시오.
getLoaderManager().restartLoader(0, null, this);
아마도 그들의 문제는 데이터베이스에서 검색이 이루어지는 순간 일 것입니다. Fragment.java의 Fragment Override 사이클에서 다음과 같은 방법으로 테스트 해보십시오.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_x, container, false); //Your query and ListView code probably will be here
Log.i("FragmentX", "Step OnCreateView");// Try with it
return rootView;
}
유사하게 넣어보십시오 Log.i
... "onStart"및 "onResume".
마지막으로 "onCreate"에서 코드를 자르고 "onStart"에 넣습니다. 예 :
@Override
public void onStart(){
super.onStart();
Log.i("FragmentX","Step OnStart");
dbManager = new DBManager(getContext());
Cursor cursor = dbManager.getAllNames();
listView = (ListView)getView().findViewById(R.id.lvNames);
adapter = new CustomCursorAdapter(getContext(),cursor,0);// your adapter
adapter.notifyDataSetChanged();
listView.setAdapter(adapter);
}
사용자 ArrayAdaper
정의이 코드를 작성하십시오.
private List<Cart_items> customListviewList ;
refreshEvents(carts);
public void refreshEvents(List<Cart_items> events)
{
this.customListviewList.clear();
this.customListviewList.addAll(events);
notifyDataSetChanged();
}
Custom ArrayAdaper에 다음 코드를 작성하십시오.
public void swapItems(ArrayList<Item> arrayList) {
this.clear();
this.addAll(arrayList);
}
참고 URL : https://stackoverflow.com/questions/4194124/best-way-to-refresh-adapter-listview-on-android
'developer tip' 카테고리의 다른 글
인형을위한 표현 트리? (0) | 2020.11.01 |
---|---|
Request.RawUrl 대 Request.Url (0) | 2020.11.01 |
XElement 네임 스페이스 (방법?) (0) | 2020.11.01 |
FormData 인터페이스를 구현하지 않는 개체에서 'append'가 호출되었습니다. (0) | 2020.10.31 |
선택 결과를 변수에 할당하는 방법은 무엇입니까? (0) | 2020.10.31 |