gpt4 book ai didi

android - 通过 AsyncTask 只加载一次 ListFragment

转载 作者:行者123 更新时间:2023-11-29 00:30:45 25 4
gpt4 key购买 nike

我正在努力学习 Android 开发,并且仍在努力思考框架的工作原理以及如何正确扩展所有这些类。

我的目标是这样的:一个 Activity,它有一个 ViewPager,它循环通过五个 ListFragment。绑定(bind)到每个 ListFragment 的数据来自 Web API,它使用 AsyncTask 调用。

我的问题是,每当我切换到一个新 fragment 时,MyListFragment.newInstance() 都会被再次调用,每次都会调用 AsyncTask。我试图让 AsyncTask 调用一次,即第一次加载 ListFragment 时,以减少网络调用并保存页面状态。最终我想做一个“下拉刷新”类型的事情,这意味着当我切换页面时不重新加载数据。

我一直在关注 this指导 Android 开发者尝试实现这一目标。我最终得到的是:

public class MainActivity extends FragmentActivity {

MyPagerAdapter mMyPagerAdapter;
ViewPager mViewPager;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMyPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());

mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mMyPagerAdapter);
}


public class MyPagerAdapter extends FragmentPagerAdapter {
public static final int NUM_PAGES = 5;

public MyPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int i) {
return MyListFragment.newInstance(getPageTitle(i).toString());
}

@Override
public int getCount() {
return NUM_PAGES;
}

@Override
public CharSequence getPageTitle(int position) {
String[] titles = getResources().getStringArray(R.array.thing_sort_titles);
return titles[position];
}

}


public static class MyListFragment extends ListFragment {
public static final String ARG_CATEGORY = "category_title";
ArrayList<HashMap<String, String>> mylist;

public MyListFragment() {
mylist = new ArrayList<HashMap<String, String>>();
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

Bundle args = getArguments();
URI url = new URI("http://api.remotesite.com/" + args.getString(ARG_CATEGORY));
new MyListAsyncTask().execute(url);
}

static MyListFragment newInstance(String category) {
MyListFragment f = new MyListFragment();

Bundle args = new Bundle();
args.putString(ARG_CATEGORY, category);
f.setArguments(args);

return f;
}

private class MyListAsyncTask extends AsyncTask<URI, Integer, ArrayList<HashMap<String, String>>> {

protected ArrayList<HashMap<String, String>> doInBackground(URI... uris) {
try {
JSONArray json = JSON.getJSONfromURL(uris[0]);
for (int i = 0; i < json.length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
JSONObject obj = json.getJSONObject(i)
map.put("title", obj.getString("title"));
map.put("author", obj.getString("author"));
map.put("id", obj.getString("id"));
mylist.add(map);
}
} catch (Exception ex) {
}
return mylist;
}

protected void onPostExecute(ArrayList<HashMap<String, String>> list) {
ListAdapter adapter = new SimpleAdapter(
getActivity(),
mylist,
R.layout.list_item,
new String[] { "title", "author" },
new int[] { R.id.text_title, R.id.text_author }
);
MyListFragment.this.setListAdapter(adapter);
}
}
}
}

我尝试在 FragmentPagerAdapter 中做一个 ListFragment 数组,并且只在该索引为 null 时调用 MyListFragment.newInstance,但它最终没有改变任何东西。

最佳答案

请尝试使用setOffscreenPageLimit解决您的问题。如果您使用它,它将缓存您的 fragment 并且不会再次调用它。

关于android - 通过 AsyncTask 只加载一次 ListFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15903236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com