Android 此[内部位置] { 获取{return mItems[position];} } //返回每行的视图 公共覆盖视图GetView(int位置、视图转换视图、视图组父视图) { 视图行=转换视图; if(行==null) { row=LayoutInflater.From(mContext).充气(Resource.Layout.listView\u rowProd,null,false); } TextView itemName=row.findviewbyd(Resource.Id.itemName); itemName.Text=mItems[position]。代码; TextView数量=row.findviewbyd(Resource.Id.quantity); 数量。Text=mItems[position]。数量; TextView price=row.findviewbyd(Resource.Id.price); price.Text=mItems[position]。price; 返回行; } }

Android 此[内部位置] { 获取{return mItems[position];} } //返回每行的视图 公共覆盖视图GetView(int位置、视图转换视图、视图组父视图) { 视图行=转换视图; if(行==null) { row=LayoutInflater.From(mContext).充气(Resource.Layout.listView\u rowProd,null,false); } TextView itemName=row.findviewbyd(Resource.Id.itemName); itemName.Text=mItems[position]。代码; TextView数量=row.findviewbyd(Resource.Id.quantity); 数量。Text=mItems[position]。数量; TextView price=row.findviewbyd(Resource.Id.price); price.Text=mItems[position]。price; 返回行; } },android,listview,xamarin,xamarin.forms,xamarin.android,Android,Listview,Xamarin,Xamarin.forms,Xamarin.android,所以基本上这个过程很简单。MainAvivity中的ListView显示来自数据库的信息。当DialogFragment打开时,用户可以在DB中插入新信息,当DialogFragment关闭时,我希望MainActivity中的ListView已经反映了更改。 因此,我考虑将ListView及其适配器传递给DialogFragment,以便调用updateAdapter()方法并将底层数据集中的更改通知ListView。 我不确定上面的问题是什么,但它不起作用。 目前,我只能开始一个新的意图,基

所以基本上这个过程很简单。MainAvivity中的ListView显示来自数据库的信息。当DialogFragment打开时,用户可以在DB中插入新信息,当DialogFragment关闭时,我希望MainActivity中的ListView已经反映了更改。 因此,我考虑将ListView及其适配器传递给DialogFragment,以便调用updateAdapter()方法并将底层数据集中的更改通知ListView。 我不确定上面的问题是什么,但它不起作用。
目前,我只能开始一个新的意图,基本上重新创建主要活动。这将自然刷新ListView。但是我想避免使用StartActivity(intent)方法,因为它比较慢

您应该更改线路的优先级

首先,您的代码应该是这样的

MyList.Adapter = MyAdapter;
Public Activity _activity;

 Public dialog_form (Activity activity)
{
   _activity=activity;
 }
MyAdapter.updateAdapter()


根据我对事物的理解,在更新后将listview及其适配器的实例携带到对话框片段,而不是分配适配器将是一种不好的做法。我通常为此类实现所做的是一些聪明的工作

在我的活动简历中,如下所示:

    protected override void OnResume()
    {
        base.OnResume();
    }
我添加了更新我的listview适配器,以便它拥有来自SQLite数据库的最新数据,然后我将更新后的适配器分配给我的listview,瞧,它工作了

确切地说,是这样的:

    protected override void OnResume()
    {
        base.OnResume();
        _myListView.adapter=new myAdapterClass(); // in your case your adapter class with parameters.
        //Also your listview object must be a global object for this to work as expected.         
    }
您还可以使用
adapter.NotifyDataSetChanged()这也会做同样的事情

这基本上是再次调用我的适配器类并更新我的数据

您可以做的另一件事是将活动实例带到dialogfragment类中

Public dialog_form (Activity activity)
{

 }
然后在局部变量中用这样的方法得到

MyList.Adapter = MyAdapter;
Public Activity _activity;

 Public dialog_form (Activity activity)
{
   _activity=activity;
 }
然后使用该类实例调用活动中的函数进行更新:

Public void svbtn(Sender s, EventArgs e)
{
    //Lines of code   ..... 
   _activity.yourUpdateFunction();
   this.Dismiss();
 }

如果它不起作用,请告诉我。
Listview
MainActivity
用户界面只有在其
Listview适配器的传递列表值更改时才会更改

Adapter.NotifyDataSetChanged()
将只通知适配器的更新。除非您传递的相同列表没有更改,否则它不会更新UI。您已经编写了在任何地方调用更新方法的复杂代码,
NotifyDataSetChanged()

请注意,在
Fragment
中,您需要设置适配器为其获取数据的
MainActivity
的列表值
prods
db.Insert(新的dbProd(name.Text,quantity.Text,price.Text))
只是更新数据库,您需要通过更新传递的值并调用
NotifyDataSetChanged
以编程方式指示适配器其已更改

无需重复调用
updateAdapter
。这是多余的

prods
全局设置为
MainActivity

prods=newlist()在updateList外部声明此

编写一个方法,在片段更改DB值时更新此值

public void UpdateDBValuesForLV(List<dbprod> newValues)
{

        prods = newValues;
        adapter.NotifyDataSetChanged();

}
public void UpdateDBValuesForLV(列出新值)
{
prods=新值;
adapter.NotifyDataSetChanged();
}
从片段更新这个。
注意:不要通过设置全局变量直接更新

//after update retrive DB values again

prods = new List<dbProd>();

    foreach (var prod in table)
    {
        prods.Add(prod);
    }
((MyActivity) getActivity()).UpdateDBValuesForLV(prods);
//再次更新检索数据库值后
prods=新列表();
foreach(表中的var prod)
{
添加(prod);
}
((MyActivity)getActivity()).UpdateDBValuesForLV(prods);

链接:

您好,您能显示竞争代码吗。只需
main活动
MyAdapter
和布局,我就可以重现您的问题。您好,我添加了更多代码。谢谢。您需要将
产品
传递到您的
对话框表单
,然后在
保存按钮
方法中,您需要将数据添加到
产品
。你试过了吗?嗨,在SaveButton_Click方法中,我调用Adapter.UpdateDapter(),它负责清除产品列表中的任何现有项,并使用DB中的新信息进行更新。我通过创建接口将数据从片段传递给活动。如果您需要,我可以向您展示一些Java代码。希望有帮助!谢谢你的回答,但是建议的改变并不能解决我的问题。还有什么想法吗?嗨,谢谢你的回答。我将OnResume()添加到MainActivity中,但当我处理dialogFragment时,然后按下按钮关闭该窗口,OnResume永远不会触发。在OnResume中,我添加了一个处理列表更新的小方法(即刷新SQLite表并获取新数据,然后将这些数据传递到列表适配器)。在此处添加活动类文件,以便我可以进行查看。嗨,我将此添加到问题中列出的MainActivity代码中。如果我在OnResume()中调试并设置断点对于MainActivity,我可以看到,当DialogFragment被解除时,代码从未停止ij OnResume(),显然,当DialogFragment被关闭时,它从未执行,我返回屏幕上只看到MainActivity。发生这种情况是因为您没有使用appcompat库,我假设是因为我很确定当你关闭一个片段时它会被调用
public void UpdateDBValuesForLV(List<dbprod> newValues)
{

        prods = newValues;
        adapter.NotifyDataSetChanged();

}
//after update retrive DB values again

prods = new List<dbProd>();

    foreach (var prod in table)
    {
        prods.Add(prod);
    }
((MyActivity) getActivity()).UpdateDBValuesForLV(prods);