gpt4 book ai didi

android - 从 OnOptionsItemSelected 更新 fragment 中的 ListView

转载 作者:行者123 更新时间:2023-11-29 16:04:02 25 4
gpt4 key购买 nike

我有一个 HomeActivity,它扩展了包含 Actionbar 项目的 Activity。 HomeActivity 有 1 个 fragment (扩展 fragment 的 StatusFragment)。在 Fragment 中有一个 ListView,它使用自定义 ArrayAdapter 和一个方法调用来提供数据。

private ParseUser[] GetUsers(){
final ParseQuery<ParseUser> query = ParseUser.getQuery();
ParseUser[] usersArray;

try {
List<ParseUser> users = query.find();
usersArray = users.toArray(new ParseUser[users.size()]);
} catch (ParseException e) {
usersArray = null;
e.printStackTrace();
}
return usersArray;
}

我无法通过 OnOptionsItemSelected 回调更新 ListView。

case R.id.home_ab_refresh:
StatusFragment pFrag = (StatusFragment) getFragmentManager().findFragmentByTag("mFragment");
pFrag.users = pFrag.GetUsers();
pFrag.mAdapter.notifyDataSetChanged();
return true;

1) 这是从 Actionbar 项目 (HomeActivity) 访问 Fragment 的适当方式吗?

2) 有没有更好的方法来设计这段代码?

非常感谢!

最佳答案

关于 1) 我可能不会做 findFragmentByTag()每次,而只是在 Activity 的 onCreate() 期间将 fragment 粘贴到 Activity 的成员变量中.

代码的主要问题是别的:

   pFrag.users = pFrag.GetUsers();
pFrag.mAdapter.notifyDataSetChanged();

这里你违反了面向对象的设计原则loose coupling . HomeActivityStatusFragment 的实现细节密切相关.您应该做的是将该代码移动到 fragment 中,并将其作为单个公共(public)方法公开,该方法以操作的 Intent (目标、用途)命名,而不是其实现.

   // In HomeActivity
pFrag.reloadData();

// In the fragment
public void reloadData() {
this.users = pFrag.GetUsers();
this.mAdapter.notifyDataSetChanged();
}

这样一来,就可以更轻松地在别处重用状态 fragment 。更重要的是,进化该 fragment 更容易,您现在可以完全更改内部结构而无需更改宿主 Activity 。从设计的角度来看,这更简洁。

关于 2) 除了我已经提到的问题之外,您应该考虑返回一个空数组而不是 null发生异常时。从 finder 方法返回空数组/集合通常是一个更好的主意,因为人们倾向于立即将结果用于迭代器或 addAll()。或类似的东西,而不先对其进行空检查。

关于android - 从 OnOptionsItemSelected 更新 fragment 中的 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21080748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com