Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从OnOptions ItemSelected更新片段中的ListView_Android_Listview_Android Fragments - Fatal编程技术网

Android 从OnOptions ItemSelected更新片段中的ListView

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

我有一个HomeActivity,它扩展了包含Actionbar项的活动。HomeActivity有1个片段(扩展片段的StatusFragment)。在片段中有一个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;
}
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;