Ich versuche, Bilder zu einer Rasteransicht hinzuzufügen. Die Ansicht Gitter wie folgt aussieht:Das dynamische Hinzufügen von Bildern zur Gridview führt zu einem Speicherfehler.
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.util.ArrayList;
/**
* Created by Khan on 29/05/2016.
*/
public class GridViewAdapter extends BaseAdapter {
private Context context;
ArrayList<String> imageTitles = new ArrayList<String>();
ArrayList<Drawable> images = new ArrayList<Drawable>();
ArrayList<File> files = new ArrayList<File>();
public GridViewAdapter(Context context, ArrayList<Drawable> images, ArrayList<String> imageTitles,ArrayList<File> files) {
this.images = images;
this.context = context;
this.imageTitles = imageTitles;
this.files = files;
}
@Override
public int getCount() {
return imageTitles.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder = null;
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(R.layout.grid_item_layout, parent, false);
holder = new ViewHolder();
holder.imageTitle = (TextView) row.findViewById(R.id.text);
holder.image = (ImageView) row.findViewById(R.id.image);
holder.imageButton = (ImageButton)row.findViewById(R.id.deleteImageButton);
holder.imageTitle.setText(imageTitles.get(position));
holder.image.setImageDrawable(images.get(position));
holder.imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Are you sure to delete image " + imageTitles.get(position) + "?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
if (files.get(position).delete()) {
Toast.makeText(context, "The image is deleted successfully.", Toast.LENGTH_LONG).show();
images.remove(position);
files.remove(position);
imageTitles.remove(position);
notifyDataSetChanged();
}
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
catch (Exception e)
{
e.printStackTrace();
// Log.d("DELETE","Something went wrong");
}
}
});
// what happens when user clicks on one of the images
holder.image.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v)
{
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" +files.get(position).toString()), "image/*");
context.startActivity(intent);
// context.startActivity(new Intent(Intent.ACTION_VIEW,)); /** replace with your own uri */
}
catch (Exception e)
{
e.printStackTrace();
// Log.d("GridView Adpater","The file path is" + files.get(position).toString());
}
}
});
return row;
}
static class ViewHolder {
TextView imageTitle;
ImageView image;
ImageButton imageButton;
}
}
Jetzt erhalte ich Bilder von meinem Gerät mit dieser Methode:
public void getImages()
{
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "AppsEye");
if(mediaStorageDir.exists())
{
String[] strings = mediaStorageDir.list();
imageTitles = new ArrayList<String>(Arrays.asList(strings));
// Log.d(TAG, "the files are: " + imageTitles);
}
try
{
for(File file : mediaStorageDir.listFiles())
{
files.add(file);
images.add(BitmapDrawable.createFromPath(file.getAbsolutePath()));
}
}
catch (Exception e)
{
e.printStackTrace();
// Log.d(TAG,"Got some exceptoin ");
}
}
Und Einstellung Adapter:
gridView = (GridView)view.findViewById(R.id.gridView);
// Log.d(TAG,"I am gallery");
getImages();
gridViewAdapter = new GridViewAdapter(getActivity(),images,imageTitles,files);
gridView.setAdapter(gridViewAdapter);
return view;
Das Problem mit obigem Code ist, dass während der Laufzeit das Hinzufügen einer Menge von Bildern zu images
Laufzeitfehler wegen Speichermangel ergibt.
Also, um obige Probleme zu vermeiden, muss ich Bilder der Gridview eins nach dem anderen hinzufügen. Wie kann ich das erreichen? Bitte hilf mir, das zu lösen.