我有一个HomeActivity,它扩展了包含Actionbar项的Activity。 HomeActivity有1个片段(StatusFragment扩展了Fragment)。在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)这是从操作栏项(HomeActivity)访问Fragment的适当方法吗
2)有没有更好的方法来设计此代码?
非常感谢!
最佳答案
关于1)我可能不会每次都执行findFragmentByTag()
,而是在活动的onCreate()
期间将片段粘贴到活动的成员变量中。
代码的主要问题是:
pFrag.users = pFrag.GetUsers();
pFrag.mAdapter.notifyDataSetChanged();
在这里,您违反了loose coupling的面向对象设计原则。
HomeActivity
与StatusFragment
的实现细节过于紧密地绑定在一起。相反,您应该做的是将代码移到片段中,并将其公开为单个公共方法,该方法是为操作的意图(目标,目的)而不是其实现而命名的。 // In HomeActivity
pFrag.reloadData();
// In the fragment
public void reloadData() {
this.users = pFrag.GetUsers();
this.mAdapter.notifyDataSetChanged();
}
这样,更容易在其他地方重用状态片段。更重要的是,更容易开发该片段,您现在可以完全更改内部结构,而不必更改主机活动。从设计角度来看,这是更清洁的方法。
关于2)除了我已经提到的问题之外,当发生异常时,您应该考虑返回一个空数组而不是
null
。通常,从finder方法返回空数组/集合是一个更好的主意,因为人们倾向于立即将结果用于迭代器或addAll()
之类的东西,而无需先对它们进行null检查。