【发布时间】: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(()=> { Adapter.NotifyDataSetChanged(); });。结果是一样的。