0

StackOverflow에서 질문을 확인했지만 문제를 해결할 수 없습니다. ListView에서 일부 데이터를 비동기 적으로 (UI 스레드를 오버로드하지 않기 위해) 가져 오려고하는데 데이터를 가져 오는 동안 ProgressDialog을 표시하려고합니다. ContentProvider을 사용하여 데이터를 가져오고 ListView에 데이터를 성공적으로로드합니다. 그러나 progressDialog은 회전하지 않지만 목록에 데이터가 표시된 후 회전하기 시작하고 멈추지 않습니다 (회전 유지). ListView이 보이면 ProgressDialog을 돌리고 dismiss()을 어떻게 만들 수 있습니까? 여기 LoadManager를 사용하는 ProgressDialog

LoaderCallbacks 구현 활동 : 그러나해서 ProgressDialog가 회전되지

public class AttractionsActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> { 

DatabaseHelper dbHelper; 
private SimpleCursorAdapter cursorAdapter; 
private ListView attractionsListView; 
private ProgressDialog progressDialog; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.custom_listview); 


    attractionsListView = (ListView)findViewById(R.id.lvCustom); 
    progressDialog = new ProgressDialog(this); 
    progressDialog.setMessage("Loading"); 
    progressDialog.setCancelable(false); 
    progressDialog.setIndeterminate(true); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 

    dbHelper = new DatabaseHelper(this); 

    dbHelper.open(); 
    populateAttractionsListView(); 
    dbHelper.close(); 
} 

private void populateAttractionsListView() { 
    //final ImageView image = (ImageView) findViewById(R.id.ivAttImage); 
    //Initialize Loader 
    getLoaderManager().initLoader(0, null, this); 
    String[] from = {PoisContract.COLUMN_POI_MAIN_PIC, PoisContract.COLUMN_POI_NAME}; 
    int[] to = {R.id.ivAttImage, R.id.tvAttName}; 
    //Initialize CursorAdapter 
    cursorAdapter = new SimpleCursorAdapter(this, R.layout.attractions_listview_row, null, from, to, 0); 
    ViewBinder viewBinder = new ViewBinder() { 
     @Override 
     public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
      boolean binded = false; 
      if(view != null){ 
       String imgName = cursor.getString(columnIndex); 
       int imgResId = getResources().getIdentifier(imgName, "drawable", getPackageName()); 
       ((ImageView) view).setImageResource(imgResId); 
       binded = true; 
      } 
      return binded; 
     } 
    }; 
    //Set Adapter but there is no cursor right now 
    attractionsListView.setAdapter(cursorAdapter); 
    //Set Binder to the adapter 
    cursorAdapter.setViewBinder(viewBinder); 
    //Hide ListView as there is no data returned 
    attractionsListView.setVisibility(View.GONE); 

} 

private Cursor getAllAttractions(){ 
    ContentResolver resolver = getContentResolver(); 

    return resolver.query(PoisContract.CONTENT_URI, PoisContract.PROJECTION, null, null, null); 
} 

@Override 
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
    progressDialog.show(this, "Please wait...", "Loading List..."); 

    CursorLoader cursorLoader = new CursorLoader(AttractionsActivity.this, PoisContract.CONTENT_URI, PoisContract.PROJECTION, null, null, null); 
    return cursorLoader; 
} 

@Override 
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
    cursorAdapter.swapCursor(cursor); 

    progressDialog.dismiss(); 
    attractionsListView.setVisibility(View.VISIBLE); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> cursorLoader) { 
    //Data is not available anymore, delete reference 
    cursorAdapter.swapCursor(null); 
} 

답변

0

좋아요. @Luksprog 도움을 주셔서 대단히 감사합니다. 나는 그 문제를 발견했다. 문제는 ContentProvier AUTHORITY 선언에 있습니다. 나는 AUTHORITY String을 한 곳에서 잘못 썼다. 그 어리석은 실수를 알아 내는데 하루가 걸렸습니다. 정말 도움을 주셔서 감사합니다.

2

을하지만리스트 데이터로 표시된 후에는

이 때문에 일어나는 회전 시작 , (올바르게) 로더를 사용하여 데이터를로드 했음에도 불구하고 메서드 (onCreate() 메서드에서) 호출에 대한 기본 UI 스레드에서 공급자를 수동으로 쿼리합니다. w UI 스레드를 차단합니다. 실제로 반환 된 커서가 전혀 사용되지 않았으므로 왜 그렇게했는지 나는 알지 못합니다. 이 문제를 해결하기 위해 onCreate() 메소드에서

Cursor cursor = getAllAttractions(); 

행을 삭제하십시오.

... 결코 멈추지 않습니다 (회전 유지).

현재 진행중인 ProgressDialog를 취소하지 않도록 잘못된 ProgressDialog 참조에서 닫기를 호출하기 때문에 이러한 현상이 발생합니다. Activity의 onCreate() 메서드에서 ProgressDialog 참조를 만들지 만 onCreateLoader() 콜백에서는 새 인스턴스 ProgressDialog (메서드는 정적 임)를 만드는 show() 메서드를 사용하므로 메서드를 호출하려고하면 onLoadFinished()를 닫으면 이전에 만든 ProgressDialog (심지어 표시되지 않음)가 해제됩니다. 이를 해결하려면 onCreateLoader() 콜백에서

progressDialog = ProgressDialog.show(this, "Please wait...", "Loading List..."); 

을 사용하십시오.

참고로 클래스 이름을 사용하여 클래스의 정적 메서드를 호출해야하며 해당 클래스의 일부 개체 참조는 필요하지 않습니다. 이렇게하면 나중에 코드를 읽는 사람과 더 명확하게 이해할 수 있습니다.

+0

로컬로 저장된 DB에서 이름을 가져 오는 ImageView를 바인딩해야하기 때문에 Cursor cursor = getAllAttractions();를 사용하고 있습니다. 줄'viewBinder.setViewValue (image, cursor, cursor.getColumnIndex (PoisContract.COLUMN_POI_MAIN_PIC)); ' – hrskrs

+0

@hrskrs 당신은 일을 잘못하고 있습니다. setViewValue()를 수동으로 호출하는 것은 좋지 않습니다. getAllAttractions()에 대한 호출과 setViewValue()에 대한 호출을 제거합니다. Th 커서는 이미 이미지와 함께 해당 열을 가지고 있으며, ViewBinder는 자동으로 바인딩을 만듭니다. – Luksprog

+0

괜찮아. 내가 당신의 도움을 주셔서 감사합니다. 나는 또한 레이아웃의'ImageView'에'setViewValue' 뷰를 제공해야합니다. 내가 어떻게 할 수 있니? – hrskrs