2012-12-31 14 views
5

Obecnie próbuję utworzyć prostą galerię obrazów, taką jak wycofany obecnie Android Gallery. Z tej galerii użytkownik może także przejść do prostego edytora obrazów, wybierając obraz z galerii. Po wielu Googlingach udało mi się znaleźć HorizontalListViewhere, który jest dokładnie tym, czego potrzebuję. Początkowo odniosłem z tym duży sukces, po prostu wstawiając obrazy do mojego folderu jako skompresowane bitmapy. Od tego czasu jednak znalazłem this video from Google I/O, w którym tworzą galerię obrazów i edytor obrazów; podobne do tego, co próbuję utworzyć. Istnieją jednak dwie główne różnice między mojej aplikacji i ich:Nie można załadować miniatur do ListView

  • używają GridView ich galerii i używam ww HorizontalListView
  • Ja próbuje tylko Załaduj zdjęcia z podanej ścieżki docelowej zamiast po prostu wszystko obrazy na karcie SD.

Do tej pory nie mogę dostosować ich kodu do mojego, ponieważ żadne z obrazów nie są ładowane do mojej galerii. Jak z filmu używam AsyncTask załadować moje miniaturki:

private class ThumbnailAsyncTask extends AsyncTask<Long, Void, Bitmap> 
    { 
     //The ImageView we will be adding the thumbnail to 
     private final ImageView mTarget; 

     public ThumbnailAsyncTask(ImageView target) 
     { 
      mTarget = target; 
     } 

     @Override 
     protected Bitmap doInBackground(Long... params) 
     { 
      final long photoID = params[0]; 

      final Bitmap result = MediaStore.Images.Thumbnails.getThumbnail(
        getContentResolver(), photoID, MediaStore.Images.Thumbnails.MINI_KIND, null); 

      return result; 
     } 

     @Override 
     protected void onPreExecute() 
     { 
      mTarget.setTag(this); 
     } 

     @Override 
     protected void onPostExecute(Bitmap result) 
     { 
      if (mTarget.getTag() == this) 
      { 
       mTarget.setImageBitmap(result); 
       mTarget.setTag(null); 
      } 
     } 
} 

i używam CursorAdapter dla obrazów w galerii:

private class PhotoAdapter extends CursorAdapter 
    { 
    public PhotoAdapter(Context context) 
    { 
     super(context, null, false); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) 
    { 
     return LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) 
    { 
     final long photoId = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID)); 

     final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); 

     /* 
     * Cancel any pending thumbnail task, since this view is now bound 
     * to new thumbnail 
     */ 
     final ThumbnailAsyncTask oldTask = (ThumbnailAsyncTask) imageView.getTag(); 

     if (oldTask != null) 
      oldTask.cancel(false);  

     /* 
     * If we arrived here, either cache is disabled or cache miss, so we 
     * need to kick task to load manually 
     */ 
     final ThumbnailAsyncTask task = new ThumbnailAsyncTask(imageView); 
     imageView.setImageBitmap(null); 
     imageView.setTag(task); 
     task.execute(photoId); 
    } 
} 

z następującymi CursorLoader

final LoaderCallbacks<Cursor> mCursorCallbacks = new LoaderCallbacks<Cursor>() 
      { 
       @Override 
       public Loader<Cursor> onCreateLoader(int id, Bundle args) 
       { 
        final String[] columns = {BaseColumns._ID}; 
        return new CursorLoader(NewProjectActivity.this, 
          Uri.fromFile(new File(mTargetPath)), columns, null, null, 
          MediaStore.Images.Media.DATE_ADDED + " DESC"); 
       } 

       @Override 
       public void onLoadFinished(Loader<Cursor> loader, Cursor data) 
       { 
        mAdapter.swapCursor(data); 
       } 

       @Override 
       public void onLoaderReset(Loader<Cursor> loader) 
       { 
        mAdapter.swapCursor(null); 
       } 
      }; 

    getLoaderManager().initLoader(LOADER_CURSOR, null, mCursorCallbacks); 

Wszelkie pomysły na to, dlaczego żaden z moich obrazów nie ładuje się?

Odpowiedz

2

Podstawowym problemem jest tutaj, bindView() metoda nie czeka na wynik asynktaksu. Musisz powiadomić swój widok listy, gdy niektóre jego treści zostaną zmienione.

Możesz wykonać następujące zmiany.

1) Zmień task.execute(photoId); na task.execute(photoId).get(); spowoduje to, że Twoja metoda bindView() będzie czekać, aż uzyskasz obraz. Takie podejście nie jest zalecane, ale pomoże ci zrozumieć dokładny problem.

LUB

2) W onPost() z asynctask, unieważnia starą zawartość twojej liście i spróbuj odświeżyć go o nowe treści.

mAdapter.notifyDataSetChanged(); 
mAdapter.notifyDataSetInvalidated(); 

LUB

3) Osobiście będę proponujemy, aby zakończyć całą operację sieciową pierwszy (tj sprowadzać obrazy), zmieniając swoją strukturę kodu, a następnie po spróbować ustawić kartę z danymi wstępnie pobrać. To nie jest idealne rozwiązanie, ale zadziałało w moim przypadku.

+0

Wypróbowałem twoją pierwszą sugestię bez powodzenia, więc w jaki sposób mam wprowadzić drugą sugestię? Czy po prostu zadzwoniłbym 'notifyDataSetChanged()'? Przepraszam, ponieważ jestem początkującym użytkownikiem Androida. –

+0

Po prostu zakończyłem porządkowanie mojego kodu zgodnie z sugestią i w końcu zadziałało. Dzięki :) –

Powiązane problemy