recuperar la ruta de la imagen de sqlite en el adaptador de imagen (GridView en Xamarin Android C #)

Anastasia

Quiero mostrar mi imagen en la vista de cuadrícula. La imagen proviene de la ruta y la ruta se almacena en la base de datos SQLite. Probé el tutorial de MSDN aquí https://docs.microsoft.com/en-us/xamarin/android/user-interface/layouts/grid-view y modifiqué y cambié mi resource.drawable.image en la ruta de la imagen ( la ruta de la imagen es de la base de datos), pero no sé cómo hacerlo. Intento usar el método de mapa de bits, pero todavía estoy confundido acerca de cómo puedo hacer una matriz usando este método. Quiero obtener los datos de la imagen, como el título de la foto, la descripción de la foto y la ruta de la foto de la base de datos y almacenarla en mi Lista <> o matriz.

Ya hice la base de datos e intento llamarla, pero todavía estoy confundido. Por favor, ayúdame.

Entonces, esta es una clase de objeto para la tabla. Se llamó Photo.cs

[Table("tblPhoto")]
    public class Photo
    {
        [PrimaryKey, AutoIncrement, Column("pkPhotoID")]
        public int PhotoID { get; set; }
    [Column("fkUserID")]
    public int UserID { get; set; }
    public string PhotoPath { get; set; }
    public string PhotoName { get; set; }
    public string PhotoDescription { get; set; }
    private DateTime _creationDate;

    public string CreationDate
    {
        get { return _creationDate.ToString(); }
        set { _creationDate = DateTime.ParseExact(value, "yyyy:MM:dd HH:mm:ss", null); }
    }

    private DateTime _uploadDate;
    public string UploadDate
    {
        get { return _uploadDate.ToString(); }
        set { _uploadDate = DateTime.Parse(value); }
    }
    //show User Photo
    public static Photo ShowUserPhoto()
    {
        return DBManager.Instance.Query<Photo>($"SELECT * FROM tblPhoto a JOIN tblUser b WHERE a.UserID== b.UserID").FirstOrDefault();
    }

    //show photo path and its photo
    public static Photo ShowPhotoPath(string aPhotoPath)
    {
        return DBManager.Instance.Query<Photo>($"SELECT * FROM tblPhoto WHERE PhotoPath=='{aPhotoPath}'").FirstOrDefault();
    }

    //show all
    public static Photo ShowAllPhoto()
    {
        return DBManager.Instance.Query<Photo>($"SELECT * FROM tblPhoto").FirstOrDefault();
    }

y el segundo es para ImageAdapter porque quiero mostrar la imagen en gridview. Llamó ImageAdapter.cs

public class ImageAdapter : BaseAdapter
    {
        private Context context;
        private List<string> gridViewString;
        private List<string> gridViewImage;
        public ImageAdapter(Context context, List<string> gridViewstr, List<string> gridViewImage)
        {
            this.context = context;
            gridViewString = gridViewstr;
            this.gridViewImage = gridViewImage;
        }
        public override int Count
        {
            get
            {
                return gridViewString.Count;
            }
        }
    public override Java.Lang.Object GetItem(int position)
    {
        return null;
    }

    public override long GetItemId(int position)
    {
        return 0;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view;
        LayoutInflater inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
        if (convertView == null)
        {
            view = new View(context);
            view = inflater.Inflate(Resource.Layout.gridview_layout, null);
            TextView txtview = view.FindViewById<TextView>(Resource.Id.textPhotoTitleViewGrid);
            ImageView imgview = view.FindViewById<ImageView>(Resource.Id.imageViewGrid);

            txtview.Text = gridViewString[position];
            imgview.SetImageBitmap(GetImageBitmapFromDB(gridViewImage[position]));
        }
        else
        {
            view = (View)convertView;
        }
        return view;
    }

    private Android.Graphics.Bitmap GetImageBitmapFromDB(string aPath)
    {
        Android.Graphics.Bitmap imageBitmap = null;

        var _getPath = Model.Photo.ShowPhotoPath(aPath);
        {
            var imgPath = _getPath.ShowPhotoPath(aPath);
            if (imgPath != null && imgPath.Length > 0)
            {
                imageBitmap = Android.Graphics.BitmapFactory.DecodeFile(imgPath);
            }
        }
        return imageBitmap;
    }
}

y el último es una clase de fragmento llamada Fragment_home.cs La imagen debe mostrarse aquí

public class Fragment_Home : Android.Support.V4.App.Fragment
    {
        List<string> m_gridviewstring = new List<string>();
        List<string> m_imgview = new List<string>();
        GridView m_gridview;
        public override void OnCreate(Bundle aSavedInstanceState)
        {
            base.OnCreate(aSavedInstanceState);
        }

        public static Fragment_Home NewInstance()
        {
            var _frag1 = new Fragment_Home { Arguments = new Bundle() };
            return _frag1;
        }

        public override View OnCreateView(LayoutInflater aInflater, ViewGroup aContainer, Bundle aSavedInstanceState)
        {
            var _ignored = base.OnCreateView(aInflater, aContainer, aSavedInstanceState);
            //String stringData = Arguments.GetString("email");
            View _view =  aInflater.Inflate(Resource.Layout.FragmentHome, null);

            //var gridview = _view.FindViewById<GridView>(Resource.Id.gridview);
            //gridview.Adapter = new ImageAdapter(Context);

            //gridview.ItemClick += Gridview_ItemClick;

            //return _view;

            var _retrievePic = Model.Photo.ShowAllPhoto();
            //_retrievePic.PhotoPath;

            ImageAdapter adapter = new ImageAdapter(Activity, m_gridviewstring, m_imgview);
            m_gridview = _view.FindViewById<GridView>(Resource.Id.grid_view_image_text);
            m_gridview.Adapter = adapter;
            return _view;
        }
    }

Por favor ayúdame, ¿alguna ayuda?

Leon Lu - MSFT

Publico dos imágenes en /storage/emulated/0/DCIM/Camera/ruta y "/storage/emulated/0/Pictures"ruta también. Para probar, cambio el nombre de las fotos.

Aquí se está ejecutando gif (ignore los fragmentos del nido, no quiero crear una nueva demostración de principio a fin, utilicé mi demostración anterior).

ingrese la descripción de la imagen aquí

En primer lugar, creo un PhotoDAO.cs, insertará datos en DB y leerá todos los datos de DB. He dado un PhotoPath y PhotoName al insertar datos en la base de datos.

  public class PhotoDAO
    {
      static  SQLiteConnection db;

        public List<Photo> GetAllPhotos()
        {
            Console.WriteLine("Reading data");
            var table = db.Table<Photo>();
            List<Photo> photos = table.ToList<Photo>();


            return photos;
        }
        public static void DoSomeDataAccess()
        {
            Console.WriteLine("Creating database, if it doesn't already exist");
            string dbPath = Path.Combine(
                 System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
                 "Photo1.db3");
            db = new SQLiteConnection(dbPath);
            db.CreateTable<Photo>();
            if (db.Table<Photo>().Count() == 0)
            {
                // only insert the data if it doesn't already exist
                var newPhoto1 = new Photo();
                newPhoto1.UserID = 1;
                newPhoto1.PhotoPath = "/storage/emulated/0/Pictures/";
                newPhoto1.PhotoName = "icon.png";
                newPhoto1.PhotoDescription = "This is a hamburger";
                db.Insert(newPhoto1);

                var newPhoto2 = new Photo();
                newPhoto2.UserID = 2;
                newPhoto2.PhotoPath = "/storage/emulated/0/Pictures/";
                newPhoto2.PhotoName = "person.jpg";
                newPhoto2.PhotoDescription = "This is a person";
                db.Insert(newPhoto2);

                var newPhoto3 = new Photo();
                newPhoto3.UserID = 3;
                newPhoto3.PhotoPath = "/storage/emulated/0/DCIM/Camera/";
                newPhoto3.PhotoName = "IMG1.jpg";
                newPhoto3.PhotoDescription = "This is a IMG1";
                db.Insert(newPhoto3);

                var newPhoto4 = new Photo();
                newPhoto4.UserID = 4;
                newPhoto4.PhotoPath = "/storage/emulated/0/DCIM/Camera/";
                newPhoto4.PhotoName = "IMG2.jpg";
                newPhoto4.PhotoDescription = "This is a IMG2";
                db.Insert(newPhoto4);

            }  
        }
    }

Luego, en Fragment_Gallery.cs, establecemos un Adapterpara GridView. Aquí está el código.

    public class Fragment_Gallery : Android.Support.V4.App.Fragment
    {
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your fragment here
        }
        public static Fragment_Gallery NewInstance()
        {
            var frag1 = new Fragment_Gallery { Arguments = new Bundle() };
            return frag1;
        }
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {

            var ignored = base.OnCreateView(inflater, container, savedInstanceState);
            View view = inflater.Inflate(Resource.Layout.galleryfragment, null);

            var gridview = view.FindViewById<GridView>(Resource.Id.gridview);

            PhotoDAO.DoSomeDataAccess();
            var photoDAO=new PhotoDAO();
            List<Photo> photos=photoDAO.GetAllPhotos();
            gridview.Adapter = new MyAdapter(this, photos);
            return view;
        }
    }

Aquí hay un código sobre mi adaptador gridview. Creo un CustomView para probar si necesita personalizar el elemento en gridview en el futuro. Configuré la fuente Imageview desde la ruta local, consulte el GetViewmétodo.

    internal class MyAdapter :BaseAdapter<Photo>
    {
        private Fragment_Gallery fragment_Gallery;
        private List<Photo> photos;

        public MyAdapter(Fragment_Gallery fragment_Gallery, List<Photo> photos)
        {
            this.fragment_Gallery = fragment_Gallery;
            this.photos = photos;
        }

        public override Photo this[int position] => photos[position];

        public override int Count => photos.Count;



        public override long GetItemId(int position)
        {
           return position;
        }

        public override View GetView(int position, View convertView, ViewGroup parent)
        {

            View view = convertView;
            if (view == null) // no view to re-use, create new
                view = fragment_Gallery.LayoutInflater.Inflate(Resource.Layout.CustomView, null);
            view.FindViewById<TextView>(Resource.Id.custUserID).Text = photos[position].UserID.ToString();
            view.FindViewById<TextView>(Resource.Id.custPhotoPath).Text = photos[position].PhotoPath;
            view.FindViewById<TextView>(Resource.Id.custPhotoName).Text = photos[position].PhotoName;
            view.FindViewById<TextView>(Resource.Id.custPhotoDescription).Text = photos[position].PhotoDescription;
            string imgFile = photos[position].PhotoPath + photos[position].PhotoName;
            Bitmap myBitmap = BitmapFactory.DecodeFile(imgFile);

            view.FindViewById<ImageView>(Resource.Id.custImage).SetImageBitmap(myBitmap);
            return view;
        }


    }

Aquí está el diseño sobre CustomView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView  
    android:layout_width="200dp"
    android:layout_height="200dp" 
    android:id="@+id/custImage" />
    <TextView
    android:layout_width="match_parent"
    android:layout_height="20dp"
    android:id="@+id/custUserID" 
    android:text="@string/abc_action_bar_home_description"
    />
    <TextView
    android:layout_width="match_parent"
    android:layout_height="20dp"
    android:id="@+id/custPhotoPath" 
    android:text="@string/abc_action_bar_home_description"
    />
    <TextView
    android:layout_width="match_parent"
    android:layout_height="20dp"
    android:id="@+id/custPhotoName" 
    android:text="@string/abc_action_bar_home_description"
    />
        <TextView
    android:layout_width="match_parent"
    android:layout_height="20dp"
    android:id="@+id/custPhotoDescription" 
    android:text="@string/abc_action_bar_home_description"
    />



</LinearLayout>

Al final, no olvide agregar android.permission.WRITE_EXTERNAL_STORAGEsuAndroidManifest.xml

Aquí está mi demostración, puede descargarla y hacer una prueba (agregue imágenes como mi clase PersonDAO o puede cambiar el nombre de la imagen en la clase PersonDAO).

https://drive.google.com/file/d/1ipw534Q0C4UxHva3Jiv5SoI0KycifpmI/view?usp=sharing

===== actualizar =======

Si desea lograr el evento de clic, puede utilizar gridview.ItemClick += Gridview_ItemClick;para lograrlo. Si no se encuentra la posición de la imagen del adaptador, agregue un punto de interrupción Photo photo = photos[e.Position];en Gridview_ItemClick, si obtuvo la posición electrónica correctamente.

   public class Fragment_Gallery : Android.Support.V4.App.Fragment
    {
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your fragment here
        }
        public static Fragment_Gallery NewInstance()
        {
            var frag1 = new Fragment_Gallery { Arguments = new Bundle() };
            return frag1;
        }
        List<Photo> photos;
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {

            var ignored = base.OnCreateView(inflater, container, savedInstanceState);
            View view = inflater.Inflate(Resource.Layout.galleryfragment, null);

            GridView gridview = view.FindViewById<GridView>(Resource.Id.gridview);
            gridview.ItemClick += Gridview_ItemClick;

            PhotoDAO.DoSomeDataAccess();
            var photoDAO=new PhotoDAO();
            photos=photoDAO.GetAllPhotos();

            gridview.Adapter = new MyAdapter(this, photos);
            return view;
        }

        private void Gridview_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
        {
            // throw new NotImplementedException();

            Photo photo = photos[e.Position];
            Intent intent= new Intent(Context, typeof(DetailActivity));
            intent.PutExtra("PicName", photo.PhotoName);
            intent.PutExtra("PicDes", photo.PhotoDescription);
            StartActivity(intent);
        }
    }

En DetailActivity, puede obtener la información de la imagen siguiendo el código.

   public class DetailActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.Detaillayout);
            TextView detailPhotoName = FindViewById<TextView>(Resource.Id.detailPhotoName);
            TextView detailPhotoDescription = FindViewById<TextView>(Resource.Id.detailPhotoDescription);

            Bundle extras =Intent.Extras;
            detailPhotoName.Text = extras.GetString("PicName");
            detailPhotoDescription.Text = extras.GetString("PicDes");
            // Create your application here
        }
    }

¿Desea mostrar la imagen más grande en el diseño de fragmentos o en el DetailActivity? En el diseño del fragmento, simplemente establezca un valor más grande para columnWidth=200dpin GridViewy abra el CustomView.xml, establezca un valor más grande para android:layout_width="200dp" android:layout_height="200dp"inImageView

Aquí está haciendo clic en correr gif.

ingrese la descripción de la imagen aquí

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

¿Cómo cargar la imagen usando la ruta de la imagen en gridview en android studio?

Cómo eliminar el archivo de imagen de Android Internal cuando la ruta se almacena en SQLite DB

Android Xamarin: recuperar la imagen almacenada en una vista de imagen

Recuperar imagen y mostrar en cuadro de imagen con la ruta de la imagen almacenada en la base de datos c #

Cómo establecer la ruta a la imagen en la carpeta en el dispositivo en la aplicación Appcelerator de Android

Ver la ruta de la imagen en el controlador

Cómo obtener el nombre de la imagen seleccionada de la galería en xamarin android

Cómo recuperar una imagen de SQLite en android studio

Recuperar la URL de la imagen cargada en Android / Cloudinary

Cómo obtener el nombre de la imagen capturada con la cámara en Xamarin Android

Cómo mostrar la imagen en el cuadro de imagen usando la ruta de la imagen en la base de datos

¿Cómo configurar el archivo SVG en la vista de imagen en Android Xamarin?

¿Cómo configurar el archivo SVG en la vista de imagen en Android Xamarin?

Recuperar la imagen de blob en el archivo

Ruta de la imagen en Vue JS

Agregue la ruta de la imagen en el script para obtener la imagen del archivo json

Cómo guardar la imagen en la base de datos con el archivo de ruta

La imagen no se muestra en el cuadro de imagen c #

Obteniendo imagen de la base de datos en Android GridView

No estoy seguro de cómo establecer la ruta correcta a una imagen en la imagen de fondo

cómo cargar la imagen de la base de datos sqlite en el paginador de vistas de Android

inicio de actividad en la vista de imagen haga clic en el adaptador de matriz personalizado

¿Cómo almacenar una ruta de imagen en la mesa?

¿Cómo enlazar la imagen de la base de datos y mostrar la imagen en gridview?

¿Cómo enlazar la imagen de la base de datos y mostrar la imagen en gridview?

Cómo retirar la imagen de la base de datos en gridview sin usar la ruta del archivo

C # abre la ruta de la imagen desde listBox y muestra la imagen en PictureBox

Leer el código de barras de la imagen de la galería en xamarin c #

Cómo obtener una imagen de la ruta del directorio en formularios xamarin

TOP Lista

CalienteEtiquetas

Archivo