developer tip

Android에서 어댑터 / ListView를 새로 고치는 가장 좋은 방법

copycodes 2020. 11. 1. 18:15
반응형

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

반응형