
这是MainActivity.java
public class MainActivity extends FragmentActivity implements Actionbar.TabListener{ private VIEwPager vIEwPager; private TabsPagerAdapter mAdapter; private Actionbar actionbar; //Tab Titles private String[] tabs = {"Sermons","More"}; private String[] sermonsList = new String[0]; //JsON URL for sermonList data private static String sermonListJsONUrl = "https://dl.dropBoxusercontent.com/u/12345/index.PHP"; //Variable to save JsON Object private static final String JsON_KEY_SERMONS = "sermon"; private JsONObject sermonListJsONObject = null; private JsONArray sermonListJsONArray = null; SermonsFragment mSermonFragment; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); //Call JsONParser Asynchronously to get sermonList in JsON Format new callJsONParserAsync().execute(sermonListJsONUrl); //this.mSermonFragment = (SermonsFragment) getFragmentManager().findFragmentByID(androID.R.ID.List); this.mSermonFragment = (SermonsFragment) getFragmentManager().findFragmentByID(R.ID.pager); //Initialization vIEwPager = (VIEwPager) findVIEwByID(R.ID.pager); actionbar = getActionbar(); mAdapter = new TabsPagerAdapter(getFragmentManager()); vIEwPager.setAdapter(mAdapter); actionbar.setHomebuttonEnabled(false); actionbar.setNavigationMode(Actionbar.NAVIGATION_MODE_TABS); //Adding Tabs for(String tab_name : tabs) { actionbar.addTab(actionbar.newTab().setText(tab_name).setTabListener(this)); } /** * on swiPing the vIEwpager make respective tab selected */ vIEwPager.setonPagechangelistener(new VIEwPager.OnPagechangelistener() { @OverrIDe public voID onPageScrolled(int position,float positionOffset,int positionOffsetPixels) { } @OverrIDe public voID onPageSelected(int position) { //on changing the page //make respected tab selected actionbar.setSelectednavigationItem(position); } @OverrIDe public voID onPageScrollStateChanged(int state) { } }); } 这是activity_main.xml
<androID.support.v4.vIEw.VIEwPager xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:ID="@+ID/pager" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"></androID.support.v4.vIEw.VIEwPager>
这是SermonsFragment.java
public class SermonsFragment extends ListFragment { private String[] sermonsList; ArrayAdapter listadapter; String imageUrl = "https://fbcdn-sphotos-b-a.akamaihd.net/" + "hphotos-ak-prn2/t1.0-9/10415605_10132423542_6220704573655530117_n.jpg"; @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sermonsList = ((MainActivity)getActivity()).getSermonsList(); //ListVIEw for the sermon List,only show if there is something in ListvIEw listadapter = new ArrayAdapter<String>(getActivity(),androID.R.layout.simple_List_item_1,sermonsList); if(listadapter.getCount() != 0) { setlistadapter(listadapter); } } @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceState) { VIEw rootVIEw = inflater.inflate(R.layout.fragment_sermons,container,false); // show The Image new getSermonBannerImage((ImageVIEw) rootVIEw.findVIEwByID(R.ID.serIEs_banner)) .execute(imageUrl); return rootVIEw; } public voID updateListVIEw(String[] newData) { if(newData.length == 0) { Log.d("myTesting3","sermonsList is Empty"); } else { Log.d("myTestingSermonFragment",newData[0]); Log.d("myTestingSermonFragment",newData[1]); } sermonsList = newData; Log.d("myTestingSermonFragment",sermonsList[1]); this.listadapter.clear(); this.listadapter.addAll(newData); this.listadapter.notifyDataSetChanged(); } 这是fragment_sermon.xml
<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" androID:background="#222222" > <linearLayout androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:orIEntation="vertical"> <!-- Shows an image from your drawable resources --> <ImageVIEw androID:ID="@+ID/serIEs_banner" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" androID:layout_gravity="center" androID:src="@drawable/serIEs_banner" /> <!-- Closing tag for the horizontal nested layout --> <VIEw androID:layout_wIDth="fill_parent" androID:layout_height="10dp" androID:layout_marginBottom="10dp" androID:background="@androID:color/darker_gray"/> <ListVIEw androID:ID="@androID:ID/List" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:background="#ffffffff" /> <TextVIEw androID:ID="@androID:ID/empty" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:layout_gravity="center" androID:gravity="center" androID:text="No Data" /> </linearLayout></relativeLayout>
这是TabsPagerAdapter.java
public class TabsPagerAdapter extends FragmentPagerAdapter { public TabsPagerAdapter(FragmentManager fm) { super(fm); } @OverrIDe public Fragment getItem(int index) { switch (index) { case 0: //Sermons fragment activity return new SermonsFragment(); case 1: //More fragment activity return new MoreFragment(); } return null; } @OverrIDe public int getCount() { //get item count - equal to number of tabs return 2; }} 最后这是错误
07-27 16:42:27.921 1549-1555/org.myapp.myapp E/jDWp﹕ Failed writing handshake bytes: broken pipe (-1 of 14)07-27 16:42:29.941 1549-1549/org.myapp.myapp E/Openglrenderer﹕ Getting MAX_TEXTURE_SIZE from GradIEnCache07-27 16:42:29.941 1549-1549/org.myapp.myapp E/Openglrenderer﹕ MAX_TEXTURE_SIZE: 1638407-27 16:42:29.953 1549-1549/org.myapp.myapp E/Openglrenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints()07-27 16:42:29.953 1549-1549/org.myapp.myapp E/Openglrenderer﹕ MAX_TEXTURE_SIZE: 1638407-27 16:42:30.353 1549-1549/org.myapp.myapp E/AndroIDRuntime﹕ FATAL EXCEPTION: main Process: org.myapp.myapp,PID: 1549 java.lang.NullPointerException at org.myapp.myapp.MainActivity$callJsONParserAsync.onPostExecute(MainActivity.java:174) at org.myapp.myapp.MainActivity$callJsONParserAsync.onPostExecute(MainActivity.java:157) at androID.os.AsyncTask.finish(AsyncTask.java:632) at androID.os.AsyncTask.access0(AsyncTask.java:177) at androID.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) at androID.os.Handler.dispatchMessage(Handler.java:102) at androID.os.Looper.loop(Looper.java:136) at androID.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method)
我不确定为什么会出现Openglrenderer错误,但是自从我创建这个应用程序以来它一直存在并运行得很好,所以这不是问题(尽管如果你能指出如何解决这个问题会很棒). MainActivity.java:174是mSermonFragment.updateListVIEw(sermonsList)上的这一行;
我怎样才能确保它正确填充?最好是异步,因此它不会锁定UI,可能是在异步完成后更新ListvIEw.
如果你也可以指出,如果在异步期间如何制作它会很好,它将检查是否有互联网连接,列表视图将显示加载圈,如果它没有互联网,或者空列表它将显示否数据,否则会显示清单
解决方法 由于您只有两个片段,因此可以跟踪它们保存实例.使用回调建议它不是最好的选择.所以,在你的寻呼机适配器中:
public class TabsPagerAdapter extends FragmentPagerAdapter { SermonsFragment mSermonsFragment; MoreFragment mMoreFragment; public TabsPagerAdapter(FragmentManager fm) { super(fm); this.mSermonsFragment = new SermonsFragment(); this.mMoreFragment = new MoreFragment(); } @OverrIDe public Fragment getItem(int index) { switch (index) { case 0: //Sermons fragment activity return mSermonsFragment; case 1: //More fragment activity return mMoreFragment; } return null; } @OverrIDe public int getCount() { //get item count - equal to number of tabs return 2; } public updateSermonsFragment(String[] data) { mSermonsFragment.updateData(data); } //i don't kNow what's the data type managed by MoreFragment public updateMoreFragment(Object data) { mMoreFragment.updateData(data) }} 创建一个方法来更新片段中的适配器:
public voID updateData(String[] newData) { this.listadapter.clear(); for(int i = 0; i < newData.length; i++) { this.listadapter.add(newData[i]); } this.listadapter.notifyDataSetChanged();} 然后你可以从你的适配器方法的AsyncTask的onPostExecute中调用这个方法:
protected voID onPostExecute(JsONObject JsonObject) { sermonListJsONObject = JsonObject; sermonListJsONArray = parseJsONObjToJsONArray(sermonListJsONObject,JsON_KEY_SERMONS); String[] sermonsList; .... // here you need set an array with the strings you parsed //here you call the new method on the adapter to update your data. mAdapter.updateSermonsFragment(sermonsList); } 另一个最佳实践是在片段中定义静态newInstace(String []数据)方法,这样您就可以在第一次网络调用时初始化片段数据,以确保您的片段有一个数据集可以使用,然后如上所述进行更新.
总结以上是内存溢出为你收集整理的android – 从Activity完成异步后填充Fragment上的ListView全部内容,希望文章能够帮你解决android – 从Activity完成异步后填充Fragment上的ListView所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)