Массив URL-адресов изображений Android Xamarin в gridview

Я просто хочу изменить свой resource.drawable.image на URL-адрес, но не знаю, как это сделать. Я пытаюсь использовать метод растрового изображения, но не знаю, как сделать его массивом с помощью этого метода. Цель этого состоит в том, что я хочу получить данные из базы данных и сохранить их в моем List<> или массиве, чтобы результат был похож на эта картинка. Он отлично работает в resource.drawable.image, но я хочу изменить значение url.

Кстати, я уже сохранил идентификатор столбца из базы данных. Я также пытаюсь сохранить столбец image_link из базы данных в цикле while и вызвать его в свой List <>, но получаю ошибку. См. Мой код ниже -> Fragment1.cs Все эти коды работают.

fragment_layout.axml:

<?xml version = "1.0" encoding = "utf-8"?>
<FrameLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:orientation = "vertical"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent">
  <RelativeLayout
    android:padding = "16dp"
    android:layout_width = "fill_parent"
    android:layout_height = "wrap_content">
    <GridView
      android:id = "@+id/grid_view_image_text"
      android:layout_width = "match_parent"
      android:layout_height = "match_parent"
      android:columnWidth = "110dp"
      android:gravity = "center"
      android:numColumns = "auto_fit"/>
  </RelativeLayout>
  <LinearLayout
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:orientation = "vertical"
      android:layout_gravity = "center" />
</FrameLayout>

gridview_layout.axml:

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:orientation = "vertical"
    android:gravity = "center_horizontal"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent">
  <ImageView
    android:layout_width = "50dp"
    android:layout_height = "50dp"
    android:layout_marginTop = "15dp"
    android:id = "@+id/imageViewGrid"/>
  <TextView
    android:layout_marginTop = "5dp"
    android:textAppearance = "?android:attr/textAppearanceMedium"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:id = "@+id/textViewGrid"/>
</LinearLayout>

CustomGridViewAdapter.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Java.Lang;

namespace testing_code
{
    public class CustomGridViewAdapter : BaseAdapter
    {
        private Context context;
        private string[] gridViewString;
        private int[] gridViewImage;
        public CustomGridViewAdapter(Context context, string[] gridViewstr, int[] gridViewImage)
        {
            this.context = context;
            gridViewString = gridViewstr;
            this.gridViewImage = gridViewImage;
        }
        public override int Count
        {
            get
            {
                return gridViewString.Length;
            }
        }

        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.textViewGrid);
                ImageView imgview = view.FindViewById<ImageView>(Resource.Id.imageViewGrid);

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

        //private Bitmap GetImageBitmapFromUrl(string url)
        //{
        //    Bitmap imageBitmap = null;

        //    using (var webClient = new WebClient())
        //    {
        //        var imageBytes = webClient.DownloadData(url);
        //        if (imageBytes != null && imageBytes.Length > 0)
        //        {
        //            imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
        //        }
        //    }

        //    return imageBitmap;
        //}
    }
}

Fragment1.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using SupportFragment = Android.Support.V4.App.Fragment;
using Android.Support.Design.Widget;
using Android.Support.V7.App;
using Android.Support.V4.Widget;
using Android.Support.V4.App;
using MySql.Data.MySqlClient;
using System.Data;

namespace testing_code
{
    public class Fragment1 : SupportFragment
    {
        MySqlConnection conn = new MySqlConnection();

        string query = "server=localhost;port=3306;database=dbsample;user id=root;password=123";

        GridView gridview;

        //string[] gridviewstring = {
        //        "location", "sound", "note"
        //};

        //int[] imgview =
        //{
        //    Resource.Drawable.ic_dashboard, Resource.Drawable.ic_headset, Resource.Drawable.ic_dashboard
        //};

        List<string> gridviewstring = new List<string>();
        List<int> imgview = new List<int>();


        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your fragment here
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            // Use this to return your custom view for this Fragment
            // return inflater.Inflate(Resource.Layout.YourFragment, container, false);

            View view = inflater.Inflate(Resource.Layout.fragment_layout, container, false);


            conn.ConnectionString = query;

            // 
            MySqlCommand cmd = new MySqlCommand("Select * from wp_kdskli23jkposts where ID in (1,2,4)", conn);

            try
            {
                conn.Open();
                MySqlDataReader reader = cmd.ExecuteReader();

                //Read, get and loop the data value from the database
                while (reader.Read())
                {
                    string asd = reader["ID"].ToString();

                    gridviewstring.Add(asd);
                }
            }
            catch(MySqlException ex)
            {
                Android.Support.V7.App.AlertDialog.Builder except = new Android.Support.V7.App.AlertDialog.Builder(Activity);
                except.SetTitle("Please report this to our website(error server timeout)");
                except.SetMessage(ex.ToString());
                except.SetPositiveButton("Ok", (senderAlert, args) =>
                {
                    except.Dispose();
                });
                except.Show();
            }
            finally
            {
                conn.Close();
            }
            //gridviewstring.Add("location");
            //gridviewstring.Add("music");
            //gridviewstring.Add("book");



            imgview.Add(Resource.Drawable.ic_dashboard);
            imgview.Add(Resource.Drawable.ic_headset);
            imgview.Add(Resource.Drawable.ic_dashboard);

            string[] GridViewStringArray = gridviewstring.ToArray();
            int[] GridImgViewArray = imgview.ToArray();

            CustomGridViewAdapter adapter = new CustomGridViewAdapter(Activity, GridViewStringArray, GridImgViewArray);
            gridview = view.FindViewById<GridView>(Resource.Id.grid_view_image_text);
            gridview.Adapter = adapter;
            return view;
        }

    }
}

Это онлайн-изображение или локальное изображение в вашей папке с возможностью переноса, и вам нужен uri или путь к файлу?

Tolulope 27.04.2018 09:16

созданный мною resource.drawable.image находится в локальном файле. Да, это в папке с возможностью переноса. Да, точно! Я хочу изменить resource.drawable.image на url, чтобы я мог получить значение столбца image_link из базы данных и вызвать его в моем массиве List <>

Jayson E Garcia 27.04.2018 09:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
566
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я отредактировал код вашего адаптера, чтобы использовать список строк

  namespace testing_code
{
    public class CustomGridViewAdapter : BaseAdapter
    {
        private Context context;
        private List<string> gridViewString;
        private List<string> gridViewImage;
        public CustomGridViewAdapter(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.textViewGrid);
                ImageView imgview = view.FindViewById<ImageView>(Resource.Id.imageViewGrid);

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

        private Android.Graphics.Bitmap GetImageBitmapFromUrl(string url)
        {
            Android.Graphics.Bitmap imageBitmap = null;

            using (var webClient = new System.Net.WebClient())
            {
                var imageBytes = webClient.DownloadData(url);
                if (imageBytes != null && imageBytes.Length > 0)
                {
                    imageBitmap = Android.Graphics.BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
               }


            }

            return imageBitmap;
        }
    }
}

Затем ваш фрагмент будет использовать список строк URL

public class Fragment1 : SupportFragment
{
    MySqlConnection conn = new MySqlConnection();

    string query = "server=localhost;port=3306;database=dbsample;user id=root;password=123";

    GridView gridview;



    List<string> gridviewstring = new List<string>();
    List<string> imgview = new List<string>();


    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Create your fragment here
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {


        View view = inflater.Inflate(Resource.Layout.fragment_layout, container, false);


        conn.ConnectionString = query;

        // 
        MySqlCommand cmd = new MySqlCommand("Select * from wp_kdskli23jkposts where ID in (1,2,4)", conn);

        try
        {
            conn.Open();
            MySqlDataReader reader = cmd.ExecuteReader();

            //Read, get and loop the data value from the database
            while (reader.Read())
            {
                string asd = reader["ID"].ToString();

                gridviewstring.Add(asd);
            }
        }
        catch (MySqlException ex)
        {
            Android.Support.V7.App.AlertDialog.Builder except = new Android.Support.V7.App.AlertDialog.Builder(Activity);
            except.SetTitle("Please report this to our website(error server timeout)");
            except.SetMessage(ex.ToString());
            except.SetPositiveButton("Ok", (senderAlert, args) =>
            {
                except.Dispose();
            });
            except.Show();
        }
        finally
        {
            conn.Close();
        }




        imgview.Add(" https://www.bellanaija.com/wp-content/uploads/2013/11/Remy-Martins-Pacesetters-VIP-Party-BellaNaija-November2013023-600x398.jpg");
        imgview.Add("http://www.allevents.ng/media/2018/at-the-club-with-remy-martins.png?width=375&mode=crop");

        imgview.Add("https://i.ytimg.com/vi/iLZz9Becq98/maxresdefault.jpg");


        CustomGridViewAdapter adapter = new CustomGridViewAdapter(Activity, gridviewstring, imgview);
        gridview = view.FindViewById<GridView>(Resource.Id.grid_view_image_text);
        gridview.Adapter = adapter;
        return view;
    }

}
}

Надеюсь это поможет

Черт возьми! Чувак, ты бог. БОЛЬШОЕ СПАСИБО ЗА СПАСЕНИЕ МОЕЙ ЖИЗНИ! ТЫ ОБАЛДЕННЫЙ! ЭТОТ МЕТОД ДЕЙСТВИТЕЛЬНО РАБОТАЕТ. Я ЗНАЮ ПЛАВНУЮ РАБОТУ. СПАСИБО ТЕБЕ СНОВА И ИЗВИНИТЕ ЗА ПОЗДНИЙ ОТВЕТ

Jayson E Garcia 02.05.2018 04:01

Толупе! Можно спросить? Можете ли вы мне снова помочь :( о том, как превратить это в асинхронную задачу, например async ... Мой Android зависает, когда я загружаю изображения 2 или более. Заранее спасибо!

Jayson E Garcia 09.05.2018 08:26

Проверьте мой ответ под своим новым вопросом

Tolulope 09.05.2018 09:03

Другие вопросы по теме