我有一个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的面向对象设计原则。 HomeActivityStatusFragment的实现细节过于紧密地绑定在一起。相反,您应该做的是将代码移到片段中,并将其公开为单个公共方法,该方法是为操作的意图(目标,目的)而不是其实现而命名的。

   // In HomeActivity
   pFrag.reloadData();

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


这样,更容易在其他地方重用状态片段。更重要的是,更容易开发该片段,您现在可以完全更改内部结构,而不必更改主机活动。从设计角度来看,这是更清洁的方法。

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

10-06 03:40