Help RecyclerView check CheckBoxy save to database

2

Hello, someone could help me please, I'm doing an application on xamarin android as a project at school, but I have doubts with a CheckBox and RecyclerView, what happens is that the user is supposed to be able to select one or several items within the RecyclerView and when you press a potion named btnagregar save all the items that have the Checked property to true in a mysql database

MenuItemA.cs

    RecyclerView mRecyclerView;
    RecyclerView.LayoutManager mLayoutManager;
    RecycleAdapter  mAdapter;
    List<ItemAli> alilist;
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate (bundle);
        new I18N.West.CP1250();
        new I18N.CJK.CP50220();
        int idC = Convert.ToInt32(Intent.GetStringExtra("idc") ?? "Data not available");


        SetContentView(Resource.Layout.RecyclerItem);

        alilist = new List<ItemAli>();
        try
        {

            string connsqlstring = "";


            MySqlConnection sqlconn = new MySqlConnection(connsqlstring);


            sqlconn.Open();


            DataSet ds = new DataSet();
            string queryString = "SELECT 'IdAli', 'NombreA', 'Precio', 'Imagen', 'Tiempo' FROM 'alimentos' as Item WHERE 'IdCategoria' = " + idC;
            MySqlDataAdapter adapter = new MySqlDataAdapter(queryString, sqlconn);
            adapter.Fill(ds, "Item");
            foreach (DataRow row in ds.Tables["Item"].Rows)
            {
                alilist.Add(new ItemAli { AliID = (row[0]).ToString(), Name = row[1].ToString(), Quantity = 0, Price = Convert.ToDecimal(row[2]), ImageId = row[3].ToString(), Time = row[4].ToString(), AddToOrder = false});
            }

            sqlconn.Close();

        }
        catch 
        {
            Toast.MakeText(this, "La categoria esta vacia", ToastLength.Short).Show();
        }



        Button btnagregar = FindViewById<Button>(Resource.Id.btanadir);


        mRecyclerView = FindViewById<RecyclerView>(Resource.Id.rvitem);


        mLayoutManager = new LinearLayoutManager(this);


        mRecyclerView.SetLayoutManager(mLayoutManager);

        mAdapter = new RecycleAdapter(this,alilist);


        mAdapter.ItemClick += OnItemClick;
        mAdapter.SpinnerItemSelectionChanged += SpinnerItemSelectionChangedEvent;

        mRecyclerView.SetAdapter(mAdapter);

        btnagregar.Click += delegate
        {


        };



    }


    void OnItemClick(object sender, string IdAlimento)
    {
        var a = new Intent(this, typeof(ActividadDetAli));
        a.PutExtra("idA", IdAlimento);
        StartActivity(a);
    }

    void SpinnerItemSelectionChangedEvent(object sender, AdapterView.ItemSelectedEventArgs e)
    {
        Spinner spinner = (Spinner)sender;
        var itemPosition = Convert.ToInt32 (spinner.Tag);
        var currentquantity = alilist[itemPosition].Quantity;
        var selectedQuantity = Convert.ToInt32( spinner.GetItemAtPosition (e.Position).ToString());
        if (currentquantity != selectedQuantity) {
            alilist [itemPosition].Quantity = selectedQuantity;
            mAdapter.NotifyItemChanged (itemPosition);
        }

    }
}

}

RecycleAdapter.cs

    public class VegeViewHolder: RecyclerView.ViewHolder
{
    public ImageView Image { get; set; }
    public TextView Name { get; set; }
    public Spinner Quantity { get; set; }
    public TextView Price { get; set; }
    public TextView TotalAmount { get; set; }
    public CheckBox cbx { get; set; }
    public string idA { get; set; }

    public VegeViewHolder(View itemView, Action<string> itemlistner, Action<object,AdapterView.ItemSelectedEventArgs> spinnerItemSelected )
        :base(itemView)
    {
        Image = itemView.FindViewById<ImageView> (Resource.Id.list_image);
        Name = itemView.FindViewById<TextView> (Resource.Id.Name);
        Price = itemView.FindViewById<TextView> (Resource.Id.Price);
        Quantity = itemView.FindViewById<Spinner> (Resource.Id.spinner1);
        TotalAmount = itemView.FindViewById<TextView> (Resource.Id.total);
        cbx = itemView.FindViewById<CheckBox>(Resource.Id.cbc);

        itemView.Click += (sender, e) => itemlistner (idA);
        Quantity.ItemSelected+= new EventHandler<AdapterView.ItemSelectedEventArgs> (spinnerItemSelected);
    }

}
public class RecycleAdapter:RecyclerView.Adapter
{
    public event EventHandler<string> ItemClick;
    public event EventHandler<AdapterView.ItemSelectedEventArgs> SpinnerItemSelectionChanged;

    public List<ItemAli> Items;
    Activity Context;
    List<string> _quantity = new List<string> ();

    public RecycleAdapter (Activity context, List<ItemAli> list)
    {
        this.Items = list;
        this.Context = context;
        PopulateSpinnerDropDownValues ();
    }

    void PopulateSpinnerDropDownValues()
    {
        _quantity.Add ("0");
        _quantity.Add ("1");
        _quantity.Add ("2");
        _quantity.Add ("3");
        _quantity.Add ("4");
        _quantity.Add ("5");
        _quantity.Add ("6");
        _quantity.Add ("7");
        _quantity.Add ("8");
        _quantity.Add ("9");
        _quantity.Add("10");
        _quantity.Add("11");
        _quantity.Add("12");
        _quantity.Add("13");
        _quantity.Add("14");
        _quantity.Add("15");
    }

    public override RecyclerView.ViewHolder
    OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        View itemView = LayoutInflater.From(parent.Context).
            Inflate(Resource.Layout.list_items, parent, false);

        VegeViewHolder vh = new VegeViewHolder(itemView, OnClick,spinner_ItemSelected);
        return vh;
    }

    public override int ItemCount
    {
        get { return Items != null ? Items.Count : 0; }
    }

    void OnClick(string IdAlimento)
    {
        if (ItemClick != null)
            ItemClick (this, IdAlimento);
    }

    private void spinner_ItemSelected (object sender, AdapterView.ItemSelectedEventArgs e)
    {
        if (SpinnerItemSelectionChanged != null)
            SpinnerItemSelectionChanged (sender, e);
    }
    public Bitmap GetBitmapFromUrl(string url)
    {
        using (WebClient webClient = new WebClient())
        {
            byte[] bytes = webClient.DownloadData(url);
            if (bytes != null && bytes.Length > 0)
            {
                return BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length);
            }
        }
        return null;
    }




    public override void OnBindViewHolder(RecyclerView.ViewHolder viewHolder, int position)
    {
        var item = Items[position];

        var vh = viewHolder as VegeViewHolder;
        var spinnerPos = 0;
        var adapter =new ArrayAdapter<String>(Context, Android.Resource.Layout.SimpleSpinnerItem, _quantity);
        adapter.SetDropDownViewResource (Android.Resource.Layout.SimpleSpinnerDropDownItem);

        vh.Name.Text = item.Name;
        vh.Price.Text = string.Format("Precio: ${0}",item.Price);
        vh.ItemView.Tag = position;
        if (item.Quantity > 0) {
            spinnerPos = adapter.GetPosition (item.Quantity.ToString ());
            vh.TotalAmount.Text = string.Format ("${0}", item.Price * item.Quantity);
        } else {
            vh.TotalAmount.Text = "";
        }
        vh.Quantity.Tag = position;
        vh.Quantity.Adapter = adapter;
        vh.Quantity.SetSelection(spinnerPos);
        Bitmap bitmap = GetBitmapFromUrl(item.ImageId);
        vh.Image.SetImageBitmap(bitmap);
        vh.idA = item.AliID +"°"+ item.ImageId + "°" + item.Name + "°" + item.Price + "°" + item.Time;
        vh.cbx.Checked = item.AddToOrder;
    }


}

}

    
asked by Rafael 30.08.2016 в 22:22
source

1 answer

0

Rafael, you can still do what you want with a ListView and the option:

listView.ChoiceMode = ChoiceMode.Multiple;

The use of RecyclerView is justified when, for example, you add or delete items and want to show a certain animation or to enter different "layouts" . But if it is to list fixed elements and select one or more, ListView is much simpler. You can see examples here

    
answered by 13.10.2016 в 00:32