1

在我的 Android 项目中,我有一个使用 Master-Detail 视图的 Activity,它由两个片段创建。不过,我的 detailfragment 给了我一些“问题”。

它由 50 多个控件(TextViews、EditTexts、CheckBoxes、Spinner)组成。在这 50 多个控件中,我以编程方式在我的详细片段中获取了对其中 32 个控件的引用,并从我的 SQLite 数据库中加载它们的数据。

当我运行它并使用初始化我的控件时

(SomeControl).findViewById(R.id.mycontrol);

LogCat 不断警告我,我可能在主线程上做的太多了。

我知道 findViewById 和膨胀视图是一项昂贵的操作,所以我有了一个想法!

我想知道是否有某种方法可以在我的细节片段上使用视图模式或视图回收,就像我在 ListFragment 上所做的那样。这样我就可以避免每次在我的 ListView 中选择另一个项目时重新初始化我的 detailview。并避免像我一样调用 .findViewById 。有没有人知道如何实现这样的事情。如果我在 detailsfragment 的 onCreate 方法中对控件进行了初始化,会有什么不同吗?我还在考虑让我的 detailsfragment 成为“单例”,然后在我的 listfragment 的选择发生变化时使用 getLoaderManager().restartLoader。对所有这一切的任何想法将不胜感激。

4

2 回答 2

0

找到了解决方案。不得不完全改变我的实现。

现在我的实现是在 ListFragment 和 DetailFragment 上使用加载器。

这是我所做的更改列表:

  1. 使用一种方法 (onSomethingClicked(SomeObject obj)) 为我的 ListFragment 创建了一个接口,并通过此接口使 ListFragment 可观察。
  2. 在我的 DetailFragment 中实现了接口,并在 ListFragment 上注册了一个监听器。
  3. 在 DetailFragment 中实现了 onSomethingClicked() 方法。当这被触发时,我将数据从 ListFragment 传递到 DetailFragment 并重新启动我的 DetailFragment-loader 并将数据加载到我在 OnLoadFinished 中已经初始化的控件中。

每次列表中的选择发生变化时都不需要膨胀视图,也不需要 .findViewById,最重要的是不再有 Choreographer 警告 :)

于 2013-09-03T12:53:02.560 回答
0

好吧,除非您为每个控件使用完全相同的布局,否则我不确定是否有办法做到这一点。

但可能有一种方法可以解决您的问题:使用 AsyncTask。

只要您的程序不需要这些控件来处理数据(并且根据您的解释,我认为在用户与之交互之前不会触发 UI 元素)您应该没问题并且主线程将是免费的做它需要的任何事情。我看到这种方法的唯一缺点是一些 UI 元素可能会晚半秒出现(如果你考虑一下,还不错)。

于 2013-09-02T21:31:40.480 回答