【问题标题】:Whats going on inside this ListView?这个 ListView 里面发生了什么?
【发布时间】:2017-11-14 15:14:16
【问题描述】:

我有一个 ListView,当我单击其中的一个项目时,会出现一个带有保存和删除按钮的对话框片段。一切正常,它会正确更新适配器,从 ListView 中删除或更新项目。现在的问题是,当我删除顶部项目或另一个项目上方的项目时,我们只说有两个项目,因为它更容易。当我删除顶部项目时,它会从 ListView 中删除,但是当我单击同一个位置时,因为现在底部项目向上移动到顶部,所以旧项目数据出现在 DialogFragment 中。换句话说,我正在选择旧项目。代码如下:

using Android.App;
using Android.Content;
using Android.OS;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;

namespace Zrelya.Fragments
{

    public class ViewPlans : FragmentSuper
    {
        private Context mContext;
        private ORM.DBRep dbr;

        private static Adapters.Plan Adapter;
        private static ListView listView;
        private static List<ORM.Plan> plansList = new List<ORM.Plan>();


        public ViewPlans(Context context)
        {
            mContext = context;
        }

        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your fragment here

            dbr = new ORM.DBRep();
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            // Use this to return your custom view for this Fragment
            var view = inflater.Inflate(Resource.Layout.ViewPlans, container, false);
            listView = view.FindViewById<ListView>(Resource.Id.listView);

            plansList = dbr.GetPlans();
            Adapter = new Adapters.Plan(mContext, plansList);
            listView.Adapter = Adapter;

            listView.ItemClick += (o, e) =>
            {
                Activity.RunOnUiThread(()=> {
                    plansList = dbr.GetPlans();
                    DialogViewPlan(plansList[e.Position]);
                });

            };

            return view;
        }



        private void DialogViewPlan(ORM.Plan plan)
        {
            if (plan != null)
            {
                FragmentTransaction transaction = Activity.FragmentManager.BeginTransaction();
                Helpers.DialogViewPlan dialog = new Helpers.DialogViewPlan(Activity, plan);
                dialog.Show(transaction, "dialog");
                dialog.OnDelete += delegate
                {


                    Activity.RunOnUiThread(()=> {
                        plansList.Remove(plan);
                        Adapter = new Adapters.Plan(mContext, plansList);
                        Adapter.NotifyDataSetChanged();
                        listView.Adapter = Adapter;
                    });



                };
                dialog.OnSave += delegate
                {
                    Adapter = new Adapters.Plan(mContext, dbr.GetPlans());

                    Adapter.NotifyDataSetChanged();
                    listView.Adapter = Adapter;
                };

            }
        }
    }
} 

【问题讨论】:

  • 在这一行Adapter = new Adapters.Plan(mContext, dbr.GetPlans()); 你确定GetPlans() 会返回除所选计划之外的所有计划吗?对于 OnSave 和 OnDelete,您可以获取值 var plans = dbr.GetPlans(); 并在其后放置一个断点以查看里面的内容。我认为您选择的计划永远不会离开plansList。
  • 在var plan = plansList[e.Position]; 上方我写了一行代码:var plansList = dbr.GetPlans() 用新计划更新列表,但它没有用..
  • 没错,plansList 永远不会更新。我该怎么做?
  • 也许您可以将plansList 保留为全局变量,并在OnDelete 中从中删除选定的计划,然后重新更新适配器,而无需dbr.GetPlans()。那是因为我假设您不想真正从数据库中删除计划?
  • 是的,我这样做了,所以我将计划列表设为全局,现在从 OnDelete 内部调用 plansList.Remove(plan);。另外,我打电话给Activity.RunOnUiThread(()=&gt; { Adapter.NotifyDataSetChanged(); });。结果是一样的。

标签: c# android listview


【解决方案1】:

在一些链接的帮助下:

Android: how to remove an item from a listView and arrayAdapter

Remove ListView item by clicking button on the item

以下是你修剪后的代码,试试看。

using Android.App;
using Android.Content;
using Android.OS;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;

namespace Zrelya.Fragments
{

    public class ViewPlans : FragmentSuper
    {
        private Context mContext;
        private ORM.DBRep dbr;

        private static Adapters.Plan Adapter;
        private static ListView listView;
        private static List<ORM.Plan> plansList = new List<ORM.Plan>();


        public ViewPlans(Context context)
        {
            mContext = context;
        }

        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your fragment here

            dbr = new ORM.DBRep();
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            // Use this to return your custom view for this Fragment
            var view = inflater.Inflate(Resource.Layout.ViewPlans, container, false);
            listView = view.FindViewById<ListView>(Resource.Id.listView);

            plansList = dbr.GetPlans();
            Adapter = new Adapters.Plan(mContext, plansList);
            listView.Adapter = Adapter;

            listView.ItemClick += (o, e) =>
            {
                Activity.RunOnUiThread(()=> {
                    //plansList = dbr.GetPlans();
                    DialogViewPlan(plansList[e.Position]);
                });

            };

            return view;
        }



        private void DialogViewPlan(ORM.Plan plan)
        {
            if (plan != null)
            {
                FragmentTransaction transaction = Activity.FragmentManager.BeginTransaction();
                Helpers.DialogViewPlan dialog = new Helpers.DialogViewPlan(Activity, plan);
                dialog.Show(transaction, "dialog");
                dialog.OnDelete += delegate
                {


                    Activity.RunOnUiThread(()=> {
                        plansList.Remove(plan);
                        //Adapter = new Adapters.Plan(mContext, plansList);
                        Adapter.NotifyDataSetChanged();
                        //listView.Adapter = Adapter;
                    });



                };
                dialog.OnSave += delegate
                {
                    //Adapter = new Adapters.Plan(mContext, dbr.GetPlans());

                    Adapter.NotifyDataSetChanged();
                    //listView.Adapter = Adapter;
                };

            }
        }
    }
} 

【讨论】:

  • 结果是一样的。我认为plansList由于某种原因没有更新。
  • 尝试在private static List&lt;ORM.Plan&gt; plansList = new List&lt;ORM.Plan&gt;(); 中使用ObservableCollection 而不是List。我将修改我的答案以说明如何。
  • 我解决了,代码一直都是正确的,问题是我有两个文件,我编辑了错误的一个......我是个傻瓜
  • @MikoM 不用担心,很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
相关资源
最近更新 更多