Как передать отдельный аргумент в вызов ListView.ItemClick в Xamarin Android C# - PullRequest
0 голосов
/ 27 февраля 2020

Итак, я пытаюсь передать аргумент в вызов ListView.ItemClick, но я не могу понять, как это сделать без ошибок, вот мой код:

 public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView(inflater, container, savedInstanceState);
        var view = inflater.Inflate(Resource.Layout.Dialog_Load, container, false);

        mListView = view.FindViewById<ListView>(Resource.Id.LoadListView);
        var responseResult = Load(UserID).Result;

        //Creates an array that contains all the different names and IDs
        string[] responseList = responseResult.Split(",");
        //Using lists to hold the different number of values as they can expand dynamically as opposed to a static array
        var ProgressionIDs = new List<string>();
        var ProgressionNames = new List<string>();

        //Separates ChordProgressionID from ChordProgressionName
        for (int index = 0; index < responseList.Length; index++)
        {
            if (int.TryParse(responseList.ElementAt(index), out _))
            {
                ProgressionIDs.Add(responseList.ElementAt(index));
            }
            else if (responseList.ElementAt(index) == "")
            {
                //Stops the last comma from responseResult creating an empty slot in the array,
                //which would create an unwanted empty item in the listview.
            }
            else
            {
                ProgressionNames.Add(responseList.ElementAt(index));
            }
        }

        //Converts name list to array so that it can be set to the adapter
        string[] ProgressionNamesArr = new string[ProgressionNames.Count()];
        ProgressionNamesArr = ProgressionNames.ToArray();

        ArrayAdapter<string> adapter = new ArrayAdapter<string>(this.Activity, Android.Resource.Layout.SimpleListItem1, ProgressionNamesArr);
        mListView.Adapter = adapter;

        mListView.ItemClick += mListView_ItemClick;

        return view;
    }
    public void mListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
    {
        int position = e.Position;
        var id = ProgressionIDs[e.Position];

    }

    private async Task<string> Load(string UserID)
    {
        //User has clicked the save button
        HttpClient client = new HttpClient();
        Uri uri = new Uri("**some url**");

        HttpContent formContent = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("UserID", UserID),
        });

        //Gets a response in terms of connection to the server
        HttpResponseMessage response = await client.PostAsync(uri, formContent);

        response.EnsureSuccessStatusCode();

        //Gets 'echo' response from PHP file.
        string responseResult = await response.Content.ReadAsStringAsync();
        return responseResult;

    }

Я понимаю, что подпрограмма OnClick, которую я сейчас имею, не имеет смысла видеть, поскольку я на самом деле не отправил экземпляр ProgressionIDs.

. Мне нужно знать, как обойти это, чтобы я мог получить положение элемента, щелкнувшего по mListView, затем выберите ProgressionIDs в этой позиции и сохраните его в переменной.

1 Ответ

0 голосов
/ 27 февраля 2020

Можете ли вы дать мне структуру данных? Один ProgressionID для одного ProgressionName?

Если это так, вы можете создать модель для Progression, которая содержит два свойства, например следующую структуру данных.

   public class Progression
{

    public string ProgressionIDs { get; set; }
    public string ProgressionNames { get; set; }
}

Я использую данные stati c для заполните List<Progression>. Когда вы щелкаете по элементу в просмотре списка, вы можете получить его, а затем записать в него, чтобы получить имя в List<Progression>

  List<Progression> progressions;
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {


        View view = inflater.Inflate(Resource.Layout.layout1, container, false);
        ListView listView1 = view.FindViewById<ListView>(Resource.Id.listView1);
        progressions = new List<Progression>();

        progressions.Add(new Progression() { ProgressionIDs="1" , ProgressionNames= "Vegetables" });
        progressions.Add(new Progression() { ProgressionIDs = "2", ProgressionNames = "Fruits" });
        progressions.Add(new Progression() { ProgressionIDs = "3", ProgressionNames = "Flower Buds" });
        progressions.Add(new Progression() { ProgressionIDs = "4", ProgressionNames = "Legumes" });
        progressions.Add(new Progression() { ProgressionIDs = "5", ProgressionNames = "Bulbs" });
       progressions.Add(new Progression() { ProgressionIDs = "6", ProgressionNames = "Tubers" });
        var myAdapter=new MyAdapter(this.Activity, progressions);
        listView1.Adapter = myAdapter;

        listView1.ItemClick += ListView1_ItemClick;
        return view;

    }

    private void ListView1_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
    {
        var myPostion= e.Position;
        Progression progression = progressions[myPostion];
        Toast.MakeText(this.Activity,progression.ProgressionIDs+" "+progression.ProgressionNames,ToastLength.Short).Show();

    }

. Вы должны создать BaseAdapter для вашего адаптера просмотра списка.

      public class MyAdapter : BaseAdapter<Progression>
{
    private Activity mActivity;
    private List<Progression> items;

    public MyAdapter(Activity mActivity, List<Progression>  progressions)
    {
        this.mActivity = mActivity;
        this.items = progressions;
    }


    public override Progression this[int position] => items[position];



    public override int Count => items.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 = mActivity.LayoutInflater.Inflate(Resource.Layout.SimpleListItem1, null);
        view.FindViewById<TextView>(Resource.Id.textView1).Text = items[position].ProgressionIDs;
        view.FindViewById<TextView>(Resource.Id.textView2).Text = items[position].ProgressionNames;

        return view;
    }

}

Здесь код относится к SimpleListItem1.

   <?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="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView1"
        android:text="test1"
        android:layout_marginRight="@dimen/abc_action_bar_content_inset_material"
    />

 <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView2"
        android:text="test2"
    />
</LinearLayout>

Здесь работает GIF.

enter image description here

...