我的AlertDialog在适配器中显示了很多次

时间:2014-03-10 15:57:18

标签: c# android xamarin.android alertdialog

当我尝试在我的适配器中显示AlertDialog时出现问题。它显示了很多次我想要删除一篇文章(每个类别的第一篇文章)或当我尝试删除一个类别时(确切地说当我删除第二个类别时)

这是我的代码

ArticlesConfigurations.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using SymaMobile.Core.Models;
using Vici.CoolStorage;
using SymaMobile.Droid.Adapters;
using Android.Database;

namespace SymaMobile.Droid
{
public class ArticlesConfiguration : Fragment
{
    private ListView listViewCatgArticles;
    private ListCategorieArticlesConfigAdapter adapterCatConfig;
    private ListArticleConfigAdapter adapterArticles;
    private List<CategoriesArticlesConfig> listCatgArticles;
    private List<ArticlesConfig> listArticles;
    private Button ajouterArticle;
    private GridView gridArticles;
    private ArticlesConfig art;
    private TextView codeBarre;
    private TextView libelle;
    private CategoriesArticlesConfig categorieActuelle;
    private Articles articleActuelle;
    private CSList<CategoriesArticles, int> catglist;
    private Spinner categorie;
    private Spinner articles;


    public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View v = inflater.Inflate(Resource.Layout.fragment_configuration_articles, container, false);

        listViewCatgArticles = v.FindViewById<ListView>(Resource.Id.lv_articles_fragment_configuration_articles);
        ajouterArticle = v.FindViewById<Button>(Resource.Id.bt_ajouter_fragment_configuration_articles);
        gridArticles = v.FindViewById<GridView>(Resource.Id.gv_articles_fragment_articles_configuration);

        listCatgArticles = CategoriesArticlesConfig.List().ToList<CategoriesArticlesConfig>();
        adapterCatConfig = new ListCategorieArticlesConfigAdapter(Activity, listCatgArticles);
        listViewCatgArticles.Adapter = adapterCatConfig;

        ajouterArticle.Click += ajouterArticle_Click;
        listViewCatgArticles.ItemClick += listViewCatgArticles_ItemClick;

        gridArticles.ItemClick += gridArticles_ItemClick;
        return v;
    }

    void gridArticles_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
    {
        if (e.Position == gridArticles.Count-1)
        {
            Android.Util.Log.Error("Position grid", ""+e.Position);
            Android.Util.Log.Error("grid Count", "" + gridArticles.Count);

            AlertDialog.Builder builder = new AlertDialog.Builder(Activity);
            builder.SetTitle(Resource.String.ajouter_categorie);
            LayoutInflater inflater = Activity.LayoutInflater;
            View v = inflater.Inflate(Resource.Layout.alertdialog_ajouter_article_configuration, null);

            codeBarre = v.FindViewById<TextView>(Resource.Id.ed_code_barre_alert_dialog_ajouter_article_configuration);
            libelle = v.FindViewById<TextView>(Resource.Id.tv_nom_article_alert_dialog_ajouter_article_configuration);
            categorie = v.FindViewById<Spinner>(Resource.Id.sp_categories_alert_dialog_ajouter_article_configuration);
            articles = v.FindViewById<Spinner>(Resource.Id.sp_articles_alert_dialog_ajouter_article_configuration);

            var adapter = new ArrayAdapter<string>(Activity, Android.Resource.Layout.SimpleSpinnerDropDownItem);

            catglist = CategoriesArticles.List();
            for (int i = 0; i < catglist.Count; i++)
            {
                adapter.Add(catglist[i].Nom);
            }
            categorie.ItemSelected += categorie_ItemSelected;
            categorie.Adapter = adapter;

            codeBarre.TextChanged+=codeBarre_TextChanged;

            builder.SetPositiveButton(Resource.String.ajouter, delegate
            {
                if (articleActuelle != null && categorieActuelle != null)
                {
                    ArticlesConfig a = ArticlesConfig.New();
                    a.Article = articleActuelle;
                    a.CategorieArticles = categorieActuelle;
                    a.Save();
                    listArticles.Add(a);
                    adapterArticles.NotifyDataSetChanged();
                }
            });

            builder.SetNegativeButton(Resource.String.annuler, (Android.Content.IDialogInterfaceOnClickListener)null);
            builder.SetView(v);
            builder.Show();
        }
    }

    void categorie_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
    {
        List<Articles> a = catglist[e.Position].Articles.ToList<Articles>();

        var adapter = new ArrayAdapter<string>(Activity, Android.Resource.Layout.SimpleSpinnerDropDownItem);

        for (int i = 0; i < a.Count; i++)
        {
            adapter.Add(a[i].Libelle);
        }
        articles.Adapter = adapter;

    }

    private void codeBarre_TextChanged(object sender, Android.Text.TextChangedEventArgs e)
    {
        if (codeBarre.Text.Length > 2)
        {
            articleActuelle = Articles.ReadFirst("CodeBarre ='" + codeBarre.Text + "'");
            if (articleActuelle != null)
            {
                libelle.Text = articleActuelle.Libelle;
            }
            else
            {
                libelle.Text = "";
            }
        }
    }

    void listViewCatgArticles_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
    {
        categorieActuelle = CategoriesArticlesConfig.Read((int)adapterCatConfig.GetItemId(e.Position));
        listArticles = categorieActuelle.ArticlesConfig.ToList();
        adapterArticles = new ListArticleConfigAdapter(Activity, listArticles);
        gridArticles.Adapter = adapterArticles;
    }

    void ajouterArticle_Click(object sender, EventArgs e)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(Activity);
        builder.SetTitle(Resource.String.ajouter_categorie);
        LayoutInflater inflater = Activity.LayoutInflater;
        View v = inflater.Inflate(Resource.Layout.alertdialog_ajouter_categorie_article_configuration, null);

        TextView nom = v.FindViewById<TextView>(Resource.Id.ed_nom_ajouter_categorie_fragment_article_configuration);

        builder.SetPositiveButton(Resource.String.ajouter, delegate
        {
            if (nom.Text.Length > 0)
            {
                CategoriesArticlesConfig c = CategoriesArticlesConfig.New();
                c.Nom = nom.Text;
                c.Save();

                c = CategoriesArticlesConfig.ReadFirst("CategorieArticlesConfigID=" + c.CategorieArticlesConfigID);
                listCatgArticles.Add(c);
                adapterCatConfig.NotifyDataSetChanged();
            }
        });

        builder.SetNegativeButton(Resource.String.annuler, (Android.Content.IDialogInterfaceOnClickListener)null);
        builder.SetView(v);
        builder.Show();
    }
}
}

ListCategorieArticlesConfigAdapter.cs

namespace SymaMobile.Droid.Adapters
{
class ListCategorieArticlesConfigAdapter : BaseAdapter
{

    private List<CategoriesArticlesConfig> list;
    private int indice;
    private Activity Activity;

    public ListCategorieArticlesConfigAdapter(Android.App.Activity Activity, List<CategoriesArticlesConfig> list)
        : base()
    {
        this.Activity = Activity;
        this.list = list;
    }

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

    public override Java.Lang.Object GetItem(int position)
    {
        return null;
    }

    public override long GetItemId(int position)
    {
        return list[position].CategorieArticlesConfigID;
    }

    public override Android.Views.View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent)
    {
        var view = (convertView ??
          Activity.LayoutInflater.Inflate(
              Resource.Layout.list_item_categories_articles_configuration,
              parent,
              false)) as LinearLayout;

        var nom = view.FindViewById(Resource.Id.tv_nom_list_item_categories_articles_configuration) as TextView;
        var modify = view.FindViewById(Resource.Id.bt_modify_list_categories_articles_configuration) as Button;
        var delete = view.FindViewById(Resource.Id.bt_delete_list_categories_articles_configuration) as Button;

        modify.Click += modify_Click;
        indice = position;

        delete.Click +=delete_Click;

        nom.Text = list[position].Nom;

        return view;
    }

    void delete_Click(object sender, EventArgs e)
    {
        Android.App.AlertDialog.Builder builder = new Android.App.AlertDialog.Builder(Activity);
        builder.SetMessage(Resource.String.msg_supprimer);
        builder.SetPositiveButton(Resource.String.oui, delegate
        {
            CSDatabase.ExecuteNonQuery("DELETE FROM CategoriesArticlesConfig WHERE CategorieArticlesConfigID=" + list[indice].CategorieArticlesConfigID);
            list.RemoveAt(indice);
            NotifyDataSetChanged();
        });
        builder.SetNegativeButton(Resource.String.non, (Android.Content.IDialogInterfaceOnClickListener)null);
        builder.Show();
    }

    void modify_Click(object sender, EventArgs e)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(Activity);
        builder.SetTitle(Resource.String.modifier_categorie);
        LayoutInflater inflater = Activity.LayoutInflater;
        View v = inflater.Inflate(Resource.Layout.alertdialog_ajouter_categorie_article_configuration, null);

        TextView _nom = v.FindViewById<TextView>(Resource.Id.ed_nom_ajouter_categorie_fragment_article_configuration);

        _nom.Text = list[indice].Nom;



        builder.SetNegativeButton(Resource.String.annuler, (Android.Content.IDialogInterfaceOnClickListener)null);
        builder.SetPositiveButton(Resource.String.modifier, delegate {
            CategoriesArticlesConfig c = CategoriesArticlesConfig.ReadFirst("CategorieArticlesConfigID=" + list[indice].CategorieArticlesConfigID);
            if (c != null)
            {
                c.Nom = _nom.Text;
                c.Save();
            }
            list[indice].Nom = _nom.Text;
            NotifyDataSetChanged();
        });
        builder.SetView(v);
        builder.Show();
    }
}
}

ListArticleConfigAdapter

namespace SymaMobile.Droid.Adapters
{
class ListArticleConfigAdapter : BaseAdapter
{
    Activity context;
    private List<ArticlesConfig> liste;
    private int indice;

    public ListArticleConfigAdapter(Activity context, List<ArticlesConfig> liste)
        : base()
    {
        this.context = context;
        this.liste = liste;
    }

    public override int Count
    {
        get { return liste.Count+1; }
    }

    public override long GetItemId(int position)
    {
        return position;
    }

    public override Android.Views.View GetView(int position, View convertView, ViewGroup parent)
    {
        var view = (convertView ??
          context.LayoutInflater.Inflate(
              Resource.Layout.list_item_article_configuration,
              parent,
              false)) as LinearLayout;

        var image = view.FindViewById(Resource.Id.iv_list_item_article_configuration) as ImageView;
        var nom = view.FindViewById(Resource.Id.tv_nom_article_list_item_article_configuration) as TextView;
        var supprimer = view.FindViewById(Resource.Id.bt_delete_list_item_article_configuration) as Button;

        Android.Util.Log.Error("Position : ", ""+position+" List Count : "+liste.Count);

        if (position < liste.Count)
        {
            nom.Text = liste[position].Article.Libelle;
            image.SetImageBitmap(Tools.ImageTools.StringToBitMap(liste[position].Article.Image));
        }
        else
        {
            nom.Text = context.Resources.GetString(Resource.String.ajouter);
            image.SetImageResource(Resource.Drawable.add128x128);
            supprimer.Visibility = ViewStates.Invisible;
        }
        indice = position;

        supprimer.Click += supprimer_Click;

        return view;
    }

    void supprimer_Click(object sender, EventArgs e)
    {
        Android.App.AlertDialog.Builder builder = new Android.App.AlertDialog.Builder(context);
        builder.SetMessage(Resource.String.msg_supprimer);
        builder.SetPositiveButton(Resource.String.oui, delegate
        {
            CSDatabase.ExecuteNonQuery("DELETE FROM ArticlesConfig WHERE ArticlesConfigID=" + liste[indice].ArticlesConfigID);
            liste.RemoveAt(indice);
            NotifyDataSetChanged();
        });
        builder.SetNegativeButton(Resource.String.non, (Android.Content.IDialogInterfaceOnClickListener)null);
        builder.Show();

    }

    public override Java.Lang.Object GetItem(int position)
    {
        return position;
    }
}
}

提前谢谢

4 个答案:

答案 0 :(得分:0)

你需要在下一个活动onbackpress或

上执行此代码
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    progressDialog.dismiss();
} 


@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed(); 
    System.exit(0);
}

答案 1 :(得分:0)

ListCategorieArticlesConfigAdapter.GetView ()中,您正在为modifydelete添加新的事件处理程序,即使视图已被回收,这意味着它已经拥有这些处理程序。将convertView ??支票转换为if/else支票,并且在convertView != null时不要重新初始化处理程序。

答案 2 :(得分:0)

修改适配器以使用视图持有者模式。这应该可以解决您的问题。

class ListCategorieArticlesConfigAdapter : BaseAdapter
{

    private List<CategoriesArticlesConfig> list;
    private Activity Activity;

    public ListCategorieArticlesConfigAdapter(Android.App.Activity Activity, List<CategoriesArticlesConfig> list)
        : base()
    {
        this.Activity = Activity;
        this.list = list;
    }

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

    public override Java.Lang.Object GetItem(int position)
    {
        return null;
    }

    public override long GetItemId(int position)
    {
        return list[position].CategorieArticlesConfigID;
    }



    public override Android.Views.View GetView(int position, Android.Views.View convertView,
        Android.Views.ViewGroup parent)
    {
        ViewHolder vh;

        var view = convertView;
        if (view == null)
        {
            view = Activity.LayoutInflater.Inflate(Resource.Layout.list_item_categories_articles_configuration,
                false);
            vh = new ViewHolder(list);
            vh.Initialize(view);
            view.Tag = vh;
        }
        vh = view.Tag as ViewHolder;
        vh.Bind(position);

        return view;
    }

    private class ViewHolder : Java.Lang.Object
    {
        private TextView _nom;
        private Button _modify;
        private Button _delete;
        private List<CategoriesArticlesConfig> _list;

        public ViewHolder(List<CategoriesArticlesConfig> list)
        {
            _list = list;
        }

        public void Initialize(View view)
        {
            _nom = view.FindViewById<TextView>(Resource.Id.tv_nom_list_item_categories_articles_configuration);
            _modify = view.FindViewById<Button>(Resource.Id.bt_modify_list_categories_articles_configuration);
            _delete = view.FindViewById<Button>(Resource.Id.bt_delete_list_categories_articles_configuration);
        }

        public void Bind(int position)
        {
            _modify.Tag = position;

            _modify.Click += modify_Click;

            _delete.Click += delete_Click;

            _nom.Text = _list[position].Nom;
        }

        void delete_Click(object sender, EventArgs e)
        {
            var indice = (int)(((View)sender).Tag);
            Android.App.AlertDialog.Builder builder = new Android.App.AlertDialog.Builder(Activity);
            builder.SetMessage(Resource.String.msg_supprimer);
            builder.SetPositiveButton(Resource.String.oui, delegate
            {
                CSDatabase.ExecuteNonQuery("DELETE FROM CategoriesArticlesConfig WHERE CategorieArticlesConfigID=" + list[indice].CategorieArticlesConfigID);
                list.RemoveAt(indice);
                NotifyDataSetChanged();
            });
            builder.SetNegativeButton(Resource.String.non, (Android.Content.IDialogInterfaceOnClickListener)null);
            builder.Show();
        }

        void modify_Click(object sender, EventArgs e)
        {
            var indice = (int)(((View)sender).Tag);
            AlertDialog.Builder builder = new AlertDialog.Builder(Activity);
            builder.SetTitle(Resource.String.modifier_categorie);
            LayoutInflater inflater = Activity.LayoutInflater;
            View v = inflater.Inflate(Resource.Layout.alertdialog_ajouter_categorie_article_configuration, null);

            TextView _nom = v.FindViewById<TextView>(Resource.Id.ed_nom_ajouter_categorie_fragment_article_configuration);

            _nom.Text = _list[indice].Nom;



            builder.SetNegativeButton(Resource.String.annuler, (Android.Content.IDialogInterfaceOnClickListener)null);
            builder.SetPositiveButton(Resource.String.modifier, delegate
            {
                CategoriesArticlesConfig c = CategoriesArticlesConfig.ReadFirst("CategorieArticlesConfigID=" + list[indice].CategorieArticlesConfigID);
                if (c != null)
                {
                    c.Nom = _nom.Text;
                    c.Save();
                }
                _list[indice].Nom = _nom.Text;
                NotifyDataSetChanged();
            });
            builder.SetView(v);
            builder.Show();
        }
    }
}

答案 3 :(得分:0)

我找到了解决方案。不是最好的,但它工作正常。

首先,我声明一个布尔变量:

bool entree;

并在GetView方法中:

if ((position == 0 && !entree) || (position != 0 && entree))
{
    ...
    entree = true;
}

全部。