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źć HorizontalListView
here, 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 wwHorizontalListView
- 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ę?
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. –
Po prostu zakończyłem porządkowanie mojego kodu zgodnie z sugestią i w końcu zadziałało. Dzięki :) –