llenar create content arrayadapter adaptador android listview xamarin

android - create - Xamarin seleccionando una imagen de la galería y mostrándola en el adaptador Listview



xamarin android list view (1)

Tengo algunas preguntas Tengo una vista de lista, un adaptador de vista de lista y una actividad en la que se encuentra la vista de lista. Además, hay un botón para cada columna de vista de lista y le permite elegir una imagen de la galería.

De modo que todos los objetos de la vista de lista están definidos en el Adaptador y no puede crear la selección de la galería desde el Adaptador. Entonces lo estoy creando con acceso a la actividad.

1-) ¿Puedo pasar los objetos de mi titular al método OnActivityResult? Eso resolvería todos los problemas

2-) Entonces, ¿cómo elijo la imagen y luego la paso a mi adaptador? Intenté usar una variable estática para la imagen uri, pero no está sincronizado. En mi clase de adaptador

public class Duzenle_Adapter { private LayoutInflater inflater; public static Android.Net.Uri static_uri; public Duzenle_Adapter(Context context, int resource, List<Yemek_Liste> objects,Duzenle_Activity d) : base(context, resource, objects) { this.c = context; this.resource = resource; this.yemekler = objects; this.d = d; } public override View GetView(int position, View convertView, ViewGroup parent) { if (inflater == null) { inflater = (LayoutInflater)c.GetSystemService(Context.LayoutInflaterService); } if (convertView == null) { convertView = inflater.Inflate(resource, parent, false); } //List<Yemek_Liste> yemekler = new List<Yemek_Liste>(); //yemekler = db.selectItem(); Tutan_Duzenle tut = new Tutan_Duzenle(convertView); tut.img.SetImageResource(yemekler[position].Get_ImageID());//default image if (!tut.res_degis.HasOnClickListeners) { tut.res_degis.Click += delegate { d.tikla(); tut.img.SetImageURI(static_uri); }; } }

Y en clase de actividad;

public class Duzenle_Activity:Activity { ...... protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); if (resultCode == Result.Ok) { Settings_Adapter.static_uri = data.Data; } } public void tikla() { var imageIntent = new Intent(); imageIntent.SetType("image/*"); imageIntent.SetAction(Intent.ActionGetContent); StartActivityForResult( Intent.CreateChooser(imageIntent, "Select photo"), 0); } }

Entonces llama a la función cuando la galería se abre, el adaptador intenta establecer uri de imagen en ninguno.

Gracias en el avance. Perdón por la publicación complicada

Editar: ¿O hay que esperar para que se complete el método "tikla"? Eso podría resolver el problema también.

Edit 2: ¿O podemos personalizar el onActivityResult? podemos enviar el objeto titular como parámetros tal vez?


[Activity(Label = "Duzenle_Activity", MainLauncher = true, Icon = "@drawable/icon")] public class Duzenle_Activity : Activity { ListView listView1; List<Yemek> objects = new List<Yemek>(); protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.ChooseImageLayout); listView1 = FindViewById<ListView>(Resource.Id.listView1); for (int i = 0; i < 20; i++) { objects.Add(new Yemek { ButtonText = $"Select {i}" }); } listView1.Adapter = new Duzenle_Adapter(this, objects); } public void tikla() { var imageIntent = new Intent(); imageIntent.SetType("image/*"); imageIntent.SetAction(Intent.ActionGetContent); StartActivityForResult( Intent.CreateChooser(imageIntent, "Select photo"), 0); } protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); if (resultCode == Result.Ok) { Duzenle_Adapter adapter = ((Duzenle_Adapter)listView1.Adapter); adapter.SelectedYemek.ImageUri = data.Data; adapter.NotifyDataSetChanged(); //or listView1.Invalidate(); } } } public class Yemek { public string ButtonText { get; set; } public Android.Net.Uri ImageUri { get; set; } } public class Duzenle_Adapter : BaseAdapter<Yemek> { List<Yemek> yemeklerList; Duzenle_Activity activity; int selectedPosition=-1; public override int Count { get { return yemeklerList.Count; } } public override Yemek this[int position] { get { return yemeklerList[position]; } } public Duzenle_Adapter(Context context, List<Yemek> objects) { this.activity = (Duzenle_Activity)context; this.yemeklerList = objects; } public override View GetView(int position, View convertView, ViewGroup parent) { if (convertView == null) // no view to re-use, create new convertView = activity.LayoutInflater.Inflate(Resource.Layout.yemekler_cell, parent, false); var yemekler = yemeklerList[position]; var btn = convertView.FindViewById<Button>(Resource.Id.button1); btn.Text = yemekler.ButtonText; btn.Tag = position; //store item position in Tag if (!btn.HasOnClickListeners) btn.Click += Btn_Click; var imgView = convertView.FindViewById<ImageView>(Resource.Id.imageView1); if (yemeklerList[position].ImageUri == null) imgView.SetImageResource(Resource.Drawable.Icon); else imgView.SetImageURI(yemeklerList[position].ImageUri); return convertView; } private void Btn_Click(object sender, EventArgs e) { selectedPosition = (int)((Button)sender).Tag; //store selected item position activity.tikla(); } public override long GetItemId(int position) { return yemeklerList[position].GetHashCode(); //not used } public Yemek SelectedYemek { get { return yemeklerList[selectedPosition]; } } }

yemekler_cell.axml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:text="Select Image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button1" /> <ImageView android:src="@android:drawable/ic_menu_gallery" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView1" android:layout_gravity="center" /> </LinearLayout>

ChooseImageLayout.axml

<?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" android:minWidth="25px" android:minHeight="25px"> <ListView android:minWidth="25px" android:minHeight="25px" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/listView1" /> </LinearLayout>