2016-11-17 97 views
0

我有幾個問題。我有一個列表視圖,列表視圖適配器和列表視圖的活動。每個列表視圖列都有一個按鈕,它允許您從畫廊中選擇一個圖像。Xamarin從圖庫中選擇圖像並在ListView適配器中顯示它

因此,所有listview的對象都是在Adapter中定義的,你不能從Adapter中創建圖庫選擇。所以即時創建與訪問該活動。

1-)我可以將持有者對象傳遞給OnActivityResult方法嗎?這將解決所有問題

2-)那麼我如何選擇圖像,然後將其傳遞給我的適配器?我嘗試使用圖像uri的靜態變量,但它沒有同步。在我的適配器類中

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); 
      }; 
     } 
    } 

而在活動類中;

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); 

    } 
} 

所以,當畫廊開闢了適配器嘗試圖像URI設置爲none它調用的函數。

在此先感謝。對不起,複雜的帖子

編輯:或者無論如何要等待「tikla」方法完成?這也可以解決問題。

編輯2:或者我們可以自定義onActivityResult?我們可以發送持有者對象作爲參數?

回答

1
[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> 

enter image description here

+0

所以保存持有人必須是靜態成員吧? –

+0

不,只是活動的成員 –

+0

更新了代碼,更詳細的示例,但仍然建議考慮通過適配器來執行 –

相關問題