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