gpt4 book ai didi

java - 如何从 ViewPager 的 onPageSelected 异步任务到 fragment ?

转载 作者:行者123 更新时间:2023-11-29 08:54:51 25 4
gpt4 key购买 nike

我是 Android 编程新手。
我用谷歌搜索和 stackoverflow,阅读了 android 文档,但没有任何帮助,或者我可能不太理解。

我正在尝试通过 ViewPager 的 onPageSelected 对 AsyncTask UI 进行分段。

像 AndroMoney 应用程序 ViewPager(在 onPageSelected 之前,它显示“正在加载...”,在 onPageSelected 时,它 AsyncTasked 并加载。):

AndroMoney ViewPager Fragment Screenshoot


但我的代码是:它在滑动时异步执行,有时它会在两个 fragment 之间停止,如下所示:

my code viewpager screenshot


与 AndroMoney 应用程序不同,我的代码不会异步处理 onPageSelected。

这里是 MyFragment.java:

public class MyFragment extends Fragment {
public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
final StringBuilder buffer=new StringBuilder();
View v;
public static final MyFragment newInstance(int message) {
MyFragment f = new MyFragment();
Bundle bdl = new Bundle(1);
bdl.putInt(EXTRA_MESSAGE, message);
f.setArguments(bdl);
return f;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
v = inflater.inflate(R.layout.myfragment_layout, container, false);
new AsyncDatabase().execute();
return v;
}

public class AsyncDatabase extends AsyncTask<Void,Void,Void>{
@Override
protected Void doInBackground(Void... params){
int message = getArguments().getInt(EXTRA_MESSAGE);
BibleService bService=new BibleServiceImpl(getActivity().getApplication());
List<Bible> bible=bService.getBibleByChapterNumber("Salm", message);
for(Bible b: bible){
for(int i=0;i<10;i++){
buffer.append(b);
}
}
return null;
}
@Override
protected void onPostExecute(Void result){
TextView txt1=(TextView)v.findViewById(R.id.textView1);
TextView txt2=(TextView)v.findViewById(R.id.textView2);
txt1.setText("Done");
txt2.setText(buffer.toString());
}
@Override
protected void onPreExecute(){
TextView txt1=(TextView)v.findViewById(R.id.textView1);
txt1.setText("Loading...");
}
@Override
protected void onProgressUpdate(Void... values){

}
}


}

这里是 PageViewActivity.java:

public class PageViewActivity extends FragmentActivity{
MyPageAdapter pageAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_page_view);

List<Fragment> fragments = getFragments();

pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);

ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
pager.setOffscreenPageLimit(1);
pager.setAdapter(pageAdapter);
pager.setCurrentItem(11);

pager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageScrollStateChanged(int state) {

}

public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}

public void onPageSelected(int position) {

}
});

}

private List<Fragment> getFragments() {
List<Fragment> fList = new ArrayList<Fragment>();

for (int j = 2; j < 150; j++) {
fList.add(MyFragment.newInstance(j));
}

return fList;
}

private class MyPageAdapter extends FragmentStatePagerAdapter {
private List<Fragment> fragments;

public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}

@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}

@Override
public int getCount() {
return this.fragments.size();
}

}


我傻傻的测试了一下,添加了如下代码:

public void onPageSelected(int position) {
new MyFragment().new AsyncDatabase().execute();
}

没用。:-P

那么,如何像 AndroMoney 应用那样从 PageViewActivity 的 onPageSelected 异步任务到 fragment 。

最佳答案

在 fragment 中公开一个新方法:

public void executeAsyncTask() {
new AsyncDatabase().execute();
}


在 Activity 中,使您的 fragment 列表成为最终 fragment ,以便您可以在适配器中访问它:

final List<MyFragment> fragments = getFragments();


然后将您的 onPageSelected() 方法更改为:

public void onPageSelected(int position) {
fragments.get(position).executeAsyncTask();
}


您还需要更新 MyPagerAdapter 以使用 MyFragment 而不是 Fragment:

private class MyPageAdapter extends FragmentStatePagerAdapter {
private List<MyFragment> fragments;

public MyPageAdapter(FragmentManager fm, List<MyFragment> fragments) {
super(fm);
this.fragments = fragments;
}

@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}

@Override
public int getCount() {
return this.fragments.size();
}

}

private List<MyFragment> getFragments() {
List<MyFragment> fList = new ArrayList<MyFragment>();

for (int j = 2; j < 150; j++) {
fList.add(MyFragment.newInstance(j));
}

return fList;
}

关于java - 如何从 ViewPager 的 onPageSelected 异步任务到 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20778865/

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