私が欲しいものグライドでスムーズに外部ストレージから画像を読み込むには?
自分で自分のギャラリーアプリケーションを欲しいです。 そのために、電話のすべてのイメージをGridLayoutManagerによってRecyclerViewにロードしたいと思っています。
仕事
私はパスを持つ外部ストレージからすべての画像を得た何。 アプリは最初に表示されます。私は私のRecyclerView下にスクロールすると
immagesは、下のスクリーンショットのように歪むことになる動作しません何
。
私はまた、logcatで、このエラーを得た:
Process: com.spicysoftware.gallery, PID: 12209
java.lang.RuntimeException: Canvas: trying to draw too large(115650308bytes) bitmap.
at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java)
at android.graphics.Canvas.drawBitmap(Canvas.java)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java)
at android.widget.ImageView.onDraw(ImageView.java)
at android.view.View.draw(View.java)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.View.draw(View.java)
at android.view.ViewGroup.drawChild(ViewGroup.java)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.View.draw(View.java)
at android.view.ViewGroup.drawChild(ViewGroup.java)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java)
at android.view.View.draw(View.java)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.View.draw(View.java)
at android.view.ViewGroup.drawChild(ViewGroup.java)
at android.support.v7.widget.RecyclerView.drawChild(RecyclerView.java:4477)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java)
at android.view.View.draw(View.java)
at android.support.v7.widget.RecyclerView.draw(RecyclerView.java:3869)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java)
at android.view.View.updateDisplayListIfDirty(View.java)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java)
at android.view.ViewRootImpl.draw(ViewRootImpl.java)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java)
at android.view.Choreographer.doCallbacks(Choreographer.java)
at android.view.Choreographer.doFrame(Choreographer.java)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java)
at android.os.Handler.handleCallback(Handler.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.app.ActivityThread.main(ActivityThread.java)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
これは私が
ます。public void loadAllImages(画像を読み込む方法です){
String[] mProjection = {MediaStore.Images.Media.DATE_TAKEN,MediaStore.Images.Media.DATA};
Cursor cursorImagesExternal = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,mProjection,null,null,MediaStore.Images.Media.DATE_ADDED);
List<ItemObject> allItems = new ArrayList<ItemObject>();
int countImages = 0;
while(cursorImagesExternal.moveToNext()) {
long date = cursorImagesExternal.getLong(0);
String fileLoc = cursorImagesExternal.getString(1);
allItems.add(new ItemObject(fileLoc));
countImages ++;
}
Log.v("Image Count: ", ""+countImages);
List<ItemObject> rowListItem = allItems;
lLayout = new GridLayoutManager(MainActivity.this, 4);
RecyclerView rView = (RecyclerView)findViewById(R.id.recycler_view);
rView.setHasFixedSize(true);
rView.setLayoutManager(lLayout);
RecyclerViewAdapter rcAdapter = new RecyclerViewAdapter(MainActivity.this, rowListItem);
rView.setAdapter(rcAdapter);
}
これは、アダプタ
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> {
private List<ItemObject> itemList;
private Context context;
public RecyclerViewAdapter(Context context, List<ItemObject> itemList) {
this.itemList = itemList;
this.context = context;
}
@Override
public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_list, null);
RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView);
return rcv;
}
@Override
public void onBindViewHolder(final RecyclerViewHolders holder, int position) {
//holder.countryName.setText(itemList.get(position).getName());
Glide.with(context).asBitmap()
.load(itemList.get(position).getName())
.thumbnail(0.5f)
.into(holder.countryPhoto);
}
@Override
public int getItemCount() {
return this.itemList.size();
}
}
card_view_list.xml
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/card_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="4"
card_view:cardUseCompatPadding="true"
android:layout_marginBottom="16dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/country_photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/action_settings"
android:src="@drawable/ic_remove_red_eye_black_24dp"
android:scaleType="centerCrop" />
</RelativeLayout>
</android.support.v7.widget.CardView>
私の質問
スムーズにGridViewコントロールにイメージをロードするためのより良い方法はありますか?
もしそうでない場合は、私のコードで何が問題になっていますか?
あなたも 'card_view_list.xml'を投稿することができますか? –
もちろん。すでに完了しました! – MSeiz5
テストのために、ImageView country_photoからlayout_widthとlayout_heightを92dpに固定しました。今、それは遅れたり何もしなくても働いています。 – MSeiz5