Aam*_*mir 6 android android-listview android-fragments
我有一个主TabActivity,有两个标签,A和B(现在).选项卡A加载一个FragmentActivity(下面给出的代码),它只包含一个FrameLayout
,所以我可以为其中的特定选项卡加载我的片段.
第一个片段有一些TextView和一个ListView.数据来自Web服务.当我单击ListView的项目时,我将该项目的详细信息加载到另一个片段(这也来自Web服务)并将当前片段(使用ListView和其他控件)替换为另一个细节片段.
为了实现这一点,我使用android-support-v4.jar库来使用Fragments,因为它们是首选.
标签A的FragmentActivity的XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/updates_frame"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/background"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
选项卡A的FragmentActivity Java代码:
public class UpdatesFragmentActivity extends FragmentActivity implements
IUpdateNotifier {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.updates);
//Load Initial Fragment into FrameLayout
//I am adding this Fragment to BackStack
Fragment newFragment = new UpdatesFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.addToBackStack(null);
ft.add(R.id.updates_frame, newFragment);
ft.commit();
}
//This is an Interface method which I call with the clicked "FEED" object to load its detail in another Fragment
@Override
public void onFeedSelected(Feed feed) {
// Instantiate a new fragment.
Fragment newFragment = new FeedDetailFragment(feed);
// Add the fragment to the activity, pushing this transaction
// on to the back stack.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.updates_frame, newFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
}
//This is another Interface Method which I call when the user presses "BACK".
//I am trying to load the previously loaded Fragment, which I added to BackStack.
//But this causes reconstruction of the previously loaded fragment. LIST in this case
//which call the web service. I DONT WANT TO CALL SERVICE AGAIN.
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个接口IUpdateNotifier,它包含两个方法:
public void onFeedSelected(Feed feed);
public void onBackPressed();
Run Code Online (Sandbox Code Playgroud)
Parent UpdatesFragmentActivity实现这些方法.我通过以下操作从子片段中调用这些方法.
但是第一个Fragment会刷新并加载来自Web服务的所有数据.
实际上,我只能获取和存储数据一次,而且在某些时间间隔内更新频繁.用户可以在需要时更新列表.最初,列表加载服务中的前10个项目,然后如果用户想要加载更多项目,则可以单击列表末尾的"更多"按钮.
它将加载接下来的10个项目,依此类推.但我想我可以将检索到的ArrayList存储在UpdatesFragmentActivity中的某个变量中,然后将该ArrayList重新分配给列表的适配器,而不是从服务加载数据,但我不知道如何使Fragment不再调用服务.
我希望它的行为就像我单击选项卡2然后再次单击选项卡1时那样.它只是显示加载的数据,就像隐藏了一样,不会调用服务.
我怎样才能做到这一点?
由于关注点分离不佳,您的设计模式存在缺陷。数据的更新应该与 UI 分离,因此当用户返回到上一个 Fragment 时,它应该与从 Web 服务加载数据无关。
有几个简单的修复方法,但我不知道什么最有效,因为您没有提供有关该问题的背景信息。
第一个选择是在启动时引入启动画面。此 Activity 将使用AsyncTask从 Web 服务下载您需要的数据。如果您只想在应用程序运行时下载一次数据,那么这种方法很有效。您需要确保不将此活动添加到历史记录中,以便当从下一个活动按下返回时,应用程序将退出。
我在许多应用程序中使用过并且我更喜欢的另一种选择是通过AlarmManager使用警报。您可以设置以特定时间间隔进行定期更新,AlarmManager 甚至可以帮助您包含时间枚举。警报将触发广播接收器,该接收器将执行您的自定义代码,从网络服务下载您需要的数据并存储它。
有一个关于这种方法的教程,可以在这里找到http://android.arnodenhond.com/tutorials/alarm-notification。
最后; 您不需要弹出后堆栈来解决此问题,尽管您可能出于完全不同的原因这样做,但在没有更多信息的情况下很难判断。
归档时间: |
|
查看次数: |
12558 次 |
最近记录: |