android – 从Activity完成异步后填充Fragment上的ListView

android – 从Activity完成异步后填充Fragment上的ListView,第1张

概述我有一个主要活动,它将从url异步中获取 JSON数据 这是MainActivity.java public class MainActivity extends FragmentActivity implements ActionBar.TabListener{ private ViewPager viewPager; private TabsPagerAdapter mAdap 我有一个主要活动,它将从url异步中获取 JSON数据

这是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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1138930.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存