Gridview плавная прокрутка и заполнение изображения из системной галереи
Я создал галерею. Я заполняю gridview из простого курсорного адаптера (пользовательская реализация).
Первая проблема заключается в том, что gridview застрял в середине при прокрутке. Я думаю, это потому, что изображения постоянно привязаны к виду взаимодействия с пользователем. Как мне добиться плавной прокрутки?
Во-вторых, я не получаю все изображения из галереи через Курсор. Что мне нужно сделать, чтобы получить все изображения. Я также заметил, что этот код не возвращает изображения на разных устройствах, таких как Samsung Galaxy s2. Работает нормально на Samsung Note 2 и Nexus 4, хотя. URI такой же: content://media/external/images/thumbnails
Код для адаптера:
/**
* @author Syed Ahmed Hussain
*/
public class CustomGalleryAdapter extends SimpleCursorAdapter {
private ContentResolver mContentResolver;
private LayoutInflater mLayoutInflater;
private int mImageIdColumnIndex;
private ImageView mImageView;
private Context mContext;
private int mLayout;
public CustomGalleryAdapter(Context pContext, int pLayout, Cursor pCursor, String[] pFrom, int[] pTo, int pFlags) {
super(pContext, pLayout, pCursor, pFrom, pTo, pFlags);
mLayout = pLayout;
mContext = pContext;
mLayoutInflater = LayoutInflater.from(mContext);
mContentResolver = mContext.getContentResolver();
mImageIdColumnIndex = pCursor.getColumnIndex(MediaStore.Images.Thumbnails.IMAGE_ID);
}
@Override
public View newView(Context pContext, Cursor pCursor, ViewGroup pParent) {
return mLayoutInflater.inflate(mLayout, null);
}
@Override
public void bindView(View pView, Context pContext, Cursor pCursor) {
long id = pCursor.getLong(mImageIdColumnIndex);
mImageView = (ImageView) pView;
mImageView.setScaleType(ScaleType.CENTER_CROP);
mImageView.setImageBitmap(MediaStore.Images.Thumbnails.getThumbnail(mContentResolver, id, MediaStore.Images.Thumbnails.MINI_KIND, new Options()));
}
}
Код для деятельности:
public class GalleryActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private String[] projection = { MediaStore.Images.Thumbnails.IMAGE_ID };
private CustomGalleryAdapter mCustomGalleryAdapter;
private String[] selectionArgs = null;
private String selection = "";
private GridView mGridView;
@Override
protected void onCreate(Bundle pSavedInstanceState) {
super.onCreate(pSavedInstanceState);
setContentView(R.layout.view_gallery);
mGridView = (GridView) findViewById(R.id.gridView);
getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int pId, Bundle pArgs) {
return new android.support.v4.content.CursorLoader(getApplicationContext(), MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> pLoader, Cursor pData) {
mCustomGalleryAdapter = new CustomGalleryAdapter(getApplicationContext(), R.layout.gallery_item, pData, projection, new int[] { R.id.galleryImageView }, 0);
mGridView.setAdapter(mCustomGalleryAdapter);
}
@Override
public void onLoaderReset(Loader<Cursor> pLoader) {
}
}
View_Galler.xml:
<?xml version="1.0" encoding="utf-8"?>
<GridView
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:numColumns="auto_fit"
android:columnWidth="100dp"
android:paddingLeft="2dp"
android:paddingRight="2dp"
android:layoutMode="opticalBounds"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:listSelector="#00000000"
android:id="@+id/gridView" />
gallery_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/galleryImageView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Кто-нибудь может подсказать, что я делаю не так? и как я могу решить эти проблемы?
2 ответа
Вот улучшения, которые вы можете попробовать:
- Использование ArrayAdapter.
- Использование шаблона ViewHolder для повторного использования представления в ячейках сетки и повторного использования convertview в getView крайне важно (**)
- Избегайте создания ненужных объектов внутри адаптера getView.
- Кэширование imga, если вы загружаете из Интернета, используя технику LazyLoading и с асинхронными задачами.
- Использование сжатых изображений в обоих случаях при использовании изображений из локального ресурса.
- андроид:fastScrollEnabled="истина".
Я бы предложил вам использовать Universal Image Loader
https://github.com/nostra13/Android-Universal-Image-Loader
Также используйте:android:largeHeap="true"
в вашем манифесте.
Объявите этот атрибут в вашем GridView (XML) android:fastScrollEnabled="true"