Android 从OnOptions ItemSelected更新片段中的ListView
我有一个HomeActivity,它扩展了包含Actionbar项的活动。HomeActivity有1个片段(扩展片段的StatusFragment)。在片段中有一个ListView,它使用一个自定义ArrayAdapter和一个方法调用来提供数据Android 从OnOptions ItemSelected更新片段中的ListView,android,listview,android-fragments,Android,Listview,Android Fragments,我有一个HomeActivity,它扩展了包含Actionbar项的活动。HomeActivity有1个片段(扩展片段的StatusFragment)。在片段中有一个ListView,它使用一个自定义ArrayAdapter和一个方法调用来提供数据 private ParseUser[] GetUsers(){ final ParseQuery<ParseUser> query = ParseUser.getQuery(); ParseUser[] usersArra
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;
}
1) 这是从Actionbar项目(HomeActivity)访问片段的适当方式吗
2) 有没有更好的方法来设计这个代码
多谢 Re 1)我可能不会每次都执行findFragmentByTag()
,而是在活动的onCreate()
期间将片段粘贴到活动的成员变量中
代码的主要问题是其他方面:
pFrag.users=pFrag.GetUsers();
pFrag.mAdapter.notifyDataSetChanged();
这里您违反了的面向对象设计原则。HomeActivity
与StatusFragment
的实现细节联系太紧密。您应该做的是将代码移动到片段中,并将其作为单个公共方法公开,该方法是根据操作的意图(目标、目的)命名的,而不是其实现
//在HomeActivity中
pFrag.reloadData();
//在片段中
公共void重载数据(){
this.users=pFrag.GetUsers();
this.mAdapter.notifyDataSetChanged();
}
这样,在其他地方重用状态片段就更容易了。更重要的是,更容易演化出该片段,您现在可以完全更改内部,而无需更改主机活动。从设计的角度来看,这更干净
RE 2)除了我已经提到的问题,当发生异常时,您应该考虑返回一个空数组而不是<代码> null < /代码>。通常,最好从finder方法返回空数组/集合,因为人们往往会立即使用迭代器或
addAll()
或类似的结果,而不首先检查它。Re 1)我可能不会每次都执行findf膈entByTag()
,在活动的onCreate()
过程中,只需将片段粘贴到活动的成员变量中即可
代码的主要问题是其他方面:
pFrag.users=pFrag.GetUsers();
pFrag.mAdapter.notifyDataSetChanged();
这里您违反了的面向对象设计原则。HomeActivity
与StatusFragment
的实现细节联系太紧密。您应该做的是将代码移动到片段中,并将其作为单个公共方法公开,该方法是根据操作的意图(目标、目的)命名的,而不是其实现
//在HomeActivity中
pFrag.reloadData();
//在片段中
公共void重载数据(){
this.users=pFrag.GetUsers();
this.mAdapter.notifyDataSetChanged();
}
这样,在其他地方重用状态片段就更容易了。更重要的是,更容易演化出该片段,您现在可以完全更改内部,而无需更改主机活动。从设计的角度来看,这更干净
RE 2)除了我已经提到的问题,当发生异常时,您应该考虑返回一个空数组而不是<代码> null < /代码>。通常,从finder方法返回空数组/集合是一个更好的主意,因为人们倾向于立即将结果用于迭代器或
addAll()
或类似的东西,而不首先对其进行null检查。首先,不进行null指针检查,因为您无法确定FragmentManager是否会返回有效的碎片
但是,您可以只捕获片段本身中的onOptionsMenuSelected事件,这将导致更为封装的代码
除此之外,什么时候刷新ListView?新数据到达后自动更新listview是否有意义?首先,您不进行空指针检查,因为您无法确定FragmentManager是否会返回有效的片段 但是,您可以只捕获片段本身中的onOptionsMenuSelected事件,这将导致更为封装的代码
除此之外,什么时候刷新ListView?新数据到达后自动更新listview是否有意义?非常感谢您的反馈!这是非常有用和简洁的信息。非常感谢您的反馈!这是非常有用和简洁的信息。+1对于通过片段处理选项菜单,我忽略了这一点。+1对于通过片段处理选项菜单,我忽略了这一点。
case R.id.home_ab_refresh:
StatusFragment pFrag = (StatusFragment) getFragmentManager().findFragmentByTag("mFragment");
pFrag.users = pFrag.GetUsers();
pFrag.mAdapter.notifyDataSetChanged();
return true;