在详细信息片段中使用ViewHolder模式

时间:2013-09-02 21:12:04

标签: android android-fragments master-detail

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

它包含50多个控件(TextViews,EditTexts,CheckBoxes,Spinner)。在这50多个控件中,我以编程方式在我的detail-fragment中获得对其中32个控件的引用,并从我的SQLite数据库加载它们的数据。

当我运行它并使用

初始化我的控件时
(SomeControl).findViewById(R.id.mycontrol);

LogCat一直警告我,我可能在主线程上做得太多了。

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

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

2 个答案:

答案 0 :(得分:0)

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

但是可能有办法解决您的问题:使用AsyncTask。

只要你的程序不需要那些控件来处理数据(并且从你的解释我认为UI元素不会被触发,直到用户与它进行交互)你应该没问题和主线程将随心所欲地做任何事情。我用这种方法看到的唯一不足之处就是一些UI元素可能会延迟半秒(如果你想的话可不会那么糟糕)。

答案 1 :(得分:0)

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

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

以下是我所做的更改列表:

  1. 使用一个方法(onSomethingClicked(SomeObject obj))为我的ListFragment创建了一个接口,并通过此接口使ListFragment可观察。
  2. 在我的DetailFragment中实现了接口,并在ListFragment上注册了一个监听器。
  3. 在DetailFragment中实现了onSomethingClicked()方法。当触发此操作时,我将数据从ListFragment传递给DetailFragment并重新启动我的DetailFragment-loader并将数据加载到OnLoadFinished中已经初始化的控件中。
  4. 每次列表中的选择发生变化时都不需要对视图进行膨胀,并且不需要.findViewById,而且最重要的是不再需要Choreographer警告:)