无法从我在 xamarin 中的自定义列表视图适配器获取微调器的选定值。 C#

Can't Get the selected value of spinner from my custom listview adapter in xamarin. C#

Xamarin 帮助。

无法在我的自定义列表视图适配器中获取微调器的 selected 值。

MyListViewAdapter.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;

namespace Kites
{
public class AttendenceViewAdapter : BaseAdapter<string>
{
    private List<string> mstudents;

    private Context mcontext;



    public AttendenceViewAdapter(Context context, List<string> stud)
    {
        mstudents = stud;
        mcontext = context;


    }
    public override int Count 
    {
        get 
        {
            return mstudents.Count;


        }
    }
    public override long GetItemId (int position)
    {
        return position;
    }
    public override string this[int position] 
    {
        get 
        {
            return mstudents [position].ToString();


        }
    }



    public override View GetView (int position, View convertView,   ViewGroup parent)
    {
        View view = convertView;
        if (view == null) // otherwise create a new one
            view = LayoutInflater.From(mcontext).Inflate(Resource.Layout.listview_attendence , null, false);
        // set view properties to reflect data for the given row
        TextView txtStudent = view.FindViewById<TextView>(Resource.Id.textStudentNameTeacherAttendence);
        txtStudent.Text = mstudents[position];
        Spinner spinner = view.FindViewById<Spinner> (Resource.Id.spinnerTeacherAttendence);



        var adapter = ArrayAdapter.CreateFromResource (mcontext, Resource.Array.attendence_array, Android.Resource.Layout.SimpleDropDownItem1Line);

        adapter.SetDropDownViewResource (Android.Resource.Layout.SimpleSpinnerDropDownItem);

        spinner.Focusable = false;
        spinner.FocusableInTouchMode = false;
        spinner.Clickable = true;

        spinner.ItemSelected += Spinner_ItemSelected;

        spinner.Adapter = adapter;
        var abcde = spinner.SelectedItemPosition;
        spinner.SetSelection (abcde);




        // return the view, populated with data, for display
        return view;
    }

    void Spinner_ItemSelected (object sender, AdapterView.ItemSelectedEventArgs e)
    {
        Spinner spinner = (Spinner)sender;
        var abc = spinner.SelectedItemPosition;

        spinner.RequestFocusFromTouch ();
        spinner.SetSelection (abc);
    }



}
}

主要Activity.cs

ListView lsStu = FindViewById<ListView> (Resource.Id.listStudentAttendence);
        AttendenceViewAdapter adapter = new AttendenceViewAdapter (this, mstudents);
lsStu.Adapter = adapter;


for(int i = 0; i < abc; i++)
            {

            View view = adapter.GetView(i, null, null);
            TextView txtStudentName = view.FindViewById<TextView> (Resource.Id.textStudentNameTeacherAttendence);
            string txtSN = txtStudentName.Text;
            Spinner spinner = view.FindViewById<Spinner> (Resource.Id.spinnerTeacherAttendence);

            var txtS = spinner.SelectedItem;
// I Cant Get The Selected Value Here. , I Am Getting the default Value not the selected value .do i do that

            string studentattendence = "insert into student_attendence values ('" + txtClassID.Text + "','" + txtClassName.Text + "','" + txtDate.Text + "','" + txtSN + "','" + txtS + "');";

                SqlCommand abcdedh = new SqlCommand (studentattendence, con);
                abcdedh.ExecuteNonQuery ();

                Toast.MakeText (this, "Attendence Saved", ToastLength.Short).Show();


            }

我得到位置 0 的默认值,但不是我 selected 的值。 当我在 mylistviewadapter 中放置一个断点时,每次我 select 一个新值时我都会得到 selected 值位置,但是我没有在主 activity 中得到它,请帮助我。

问题是:你调用 adapter.GetView(i, null, null); 所以第二个参数 convertViewnull 这意味着你将膨胀一个新视图。

这种方法失败了,因为 GetView 不打算从 ListView 或使用适配器的视图外部调用。这将失败的第二个原因是称为视图重用的机制。如果您的列表中有 100 个项目,则创建的视图会少得多(只能同时在屏幕上显示,再加上一些以实现平滑滚动)。

您应该使用的方法是:

创建一个 class Attendance,其中包含姓名和您需要的所有其他值。

public class Attendence
{
    public string ClassId { get; set; }
    public string ClassName { get; set; }
    public string StudentName { get; set; }
    public string Attendence { get; set; }
    //TODO: maybe some more
}

继承自 BaseAdapter<Attendence>

如果列表项中的值发生变化,请将它们写回给当前学生(例如在您的 Spinner_ItemSelected 中)。

public class AttendenceViewAdapter : BaseAdapter<Attendence>
{
    private List<Attendence> mstudents;
    private Context mcontext;

    public AttendenceViewAdapter(Context context, List<Attendence> stud)
    {
        mstudents = stud;
        mcontext = context;
    }

    // ...

    public override View GetView (int position, View convertView,   ViewGroup parent)
    {
        View view = convertView;
        Spinner spinner;
        if (view == null){
            view = LayoutInflater.From(mcontext).Inflate(Resource.Layout.listview_attendence , null, false);
            spinner = view.FindViewById<Spinner> (Resource.Id.spinnerTeacherAttendence);
            var adapter = ArrayAdapter.CreateFromResource (mcontext, Resource.Array.attendence_array, Android.Resource.Layout.SimpleDropDownItem1Line);

            adapter.SetDropDownViewResource (Android.Resource.Layout.SimpleSpinnerDropDownItem);

            spinner.Focusable = false;
            spinner.FocusableInTouchMode = false;
            spinner.Clickable = true;

            spinner.ItemSelected += Spinner_ItemSelected;
            spinner.Adapter = adapter;
        }
        else {
            spinner = view.FindViewById<Spinner> (Resource.Id.spinnerTeacherAttendence);
        }

        // set view properties to reflect data for the given row
        TextView txtStudent = view.FindViewById<TextView>(Resource.Id.textStudentNameTeacherAttendence);
        txtStudent.Text = mstudents[position].StudentName;

        // TODO: use mstudents[position].Attendence here
        var abcde = spinner.SelectedItemPosition;
        spinner.SetSelection(abcde);
        spinner.Tag = position; // use this to know which student has been edited

        // return the view, populated with data, for display
        return view;
    }

    void Spinner_ItemSelected (object sender, AdapterView.ItemSelectedEventArgs e)
    {
        Spinner spinner = (Spinner)sender;
        var abc = spinner.SelectedItemPosition;
        var position = (int)spinner.Tag;

        spinner.RequestFocusFromTouch ();
        spinner.SetSelection (abc);

        mstudents[position].Attendence = //TODO: selected value of the spinner;
    }
}

在您的 MainActivity 中,您可以遍历学生列表,而不是列表的视图。

// given: students is your list of Attendence   
foreach(Attendence attendence in students)
{
    string studentattendence = "insert into student_attendence values ('" + attendence.ClassId + "','" + attendence.ClassName + "','" + txtDate.Text + "','" + txtSN + "','" + attendence.Attendence + "');";

    SqlCommand abcdedh = new SqlCommand (studentattendence, con);
    abcdedh.ExecuteNonQuery ();

    Toast.MakeText (this, "Attendence Saved", ToastLength.Short).Show();
}