如何更新片段寻呼机适配器的片段? [英] How to update Fragment Pager Adapter from Fragments?

查看:110
本文介绍了如何更新片段寻呼机适配器的片段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题::

我在我所新增了六个片段1 SherlockFragmentActivity。 现在出六3个片段基础上的条件加入。

加载碎片::

 私人无效loadFragments()
{
    尝试
    {
        dataHelper =新DataHelper(本);
        menuInfo = dataHelper.getTransMenuInfo();

        servicesName =新的ArrayList<字符串>();
        servicesImage =新的ArrayList<整数GT;();

        如果(menu​​Info.contains(1))
        {
            servicesName.add(dataHelper.getTransMenu_ModuleName(1));
            servicesImage.add(R.drawable.icon);
        }
        如果(menu​​Info.contains(2))
        {
            servicesName.add(dataHelper.getTransMenu_ModuleName(2));
            servicesImage.add(R.drawable.icon);
        }
        如果(menu​​Info.contains(4))
        {
            servicesName.add(dataHelper.getTransMenu_ModuleName(4));
            servicesImage.add(R.drawable.icon);
        }

        dataHelper.close();
        servicesName.add(片段4);
        servicesImage.add(R.drawable.wallet);

        servicesName.add(片段5);
        servicesImage.add(R.drawable.reports);

        servicesName.add(片段6);
        servicesImage.add(R.drawable.setting);

        名单<片断>片段= getFragments();

        如果(片段=空&安培;!&安培; fragments.size()大于0)
        {
            actionbartabmenuAdapter =新ActionBarTabMenuAdapter(getSupportFragmentManager(),片段,对此,servicesName,servicesImage);
            awesomePager.setAdapter(actionbartabmenuAdapter);
        }
    }
    赶上(SQLiteException E)
    {
        e.printStackTrace();
    }
    赶上(NullPointerException异常E)
    {
        e.printStackTrace();
    }
    赶上(例外五)
    {
        e.printStackTrace();
    }
}
 

适配器::

 私有类ActionBarTabMenuAdapter扩展FragmentPagerAdapter
{
    活动范围内;
    上下文CTX;
    ArrayList的<字符串> menuInfo;
    私人列表<片断>片段;
    ArrayList的<字符串>服务;
    ArrayList的<整数GT;图像;

    公共ActionBarTabMenuAdapter(FragmentManager FM,名单,其中,片断>的片段,上下文CTX,ArrayList的<字符串> servicesName,ArrayList的<整数GT; servicesImage)
    {
        超(FM);
        this.context =(活动)CTX;
        dataHelper =新DataHelper(CTX);
        menuInfo = dataHelper.getTransMenuInfo();
        dataHelper.close();

        this.services = servicesName;
        this.images = servicesImage;
        this.fragments =片段;
        menuInfo.add(钱包钱包);
        menuInfo.add(报告);
        menuInfo.add(设置);
    }

    @覆盖
    公众诠释getCount将()
    {
        返回fragments.size();
    }
    @覆盖
    公共片段的getItem(INT位置)
    {
        返回this.fragments.get(位置);
    }
}

类ViewHolder {
    TextView的标题,描述,ReadMore;
}
 

在过去的片段(即片段6),其中我有一个选项updation,现在点击该按钮,我取出我的本地数据库,并从服务器获得新的价值,并将其存储在我的本地数据库。

所以再次加载,我只是再次检查条件和创建片段列表accordingly.so基本上它不是强制性的片段将6每次加载的碎片之前,它可以是3,4或5也。

我想::

所以,我想添加或删除鉴于寻呼机片段内键的fragment.On一下,如果我得到的名单4段话,应该是4的显示,没有。片段在那个时候(由onSwipe或onTabChanged)。

我曾尝试? ::

要做到这一点,我已经创建了一个接口的方法 loadMenu()这样的:

  MenuInterface mInterface =新MenuInterface(){
    @覆盖
    公共无效loadMenu(){
        loadFragments();
    }
};
 

现在的片段6我已经过了接口的对象从TestActivity(从那里我设置的适配器)

  fList.add(SettingsListFragment.newInstance(这一点,设置,extraMessage,mInterface));
 

现在的片段6的新InstanceMethod我得到的对象,并调用 loadMenu()方法。

但现在我得到以下异常应用此机制后......

错误::

  java.lang.IllegalStateException:必须从过程的主线程调用
在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1392)
在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
在android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
在android.support.v4.view.ViewPager.setAdapter(ViewPager.java:321)
在com.example.testapp.TestActivity.loadFragments(TestActivity.java:238)
com.example.testapp.TestActivity.access $ 0(TestActivity.java:193)
在v.ButtonPayActivity $ 1.loadTransactionMenu(TestActivity.java:596)
在com.example.testapp.home.SettingsListFragment $ 4.run(SettingsListFragment.java:769)
在java.lang.Thread.run(Thread.java:1019)
 

修改::

  MenuInterface mMenuInterface =新MenuInterface(){
        @覆盖
        公共无效loadTransactionMenu(){
            runOnUiThread(新的Runnable(){
                公共无效的run(){
                    loadFragments();
                    如果(actionbartabmenuAdapter!= NULL){
                        actionbartabmenuAdapter.notifyDataSetChanged();
                    }
                }
            });
        }
    };
 

适配器::

 私有类ActionBarTabMenuAdapter扩展FragmentStatePagerAdapter
{
    活动范围内;
    上下文CTX;
    ArrayList的<字符串> menuInfo;
    私人列表<片断>片段;
    ArrayList的<字符串>服务;
    ArrayList的<整数GT;图像;

    公共ActionBarTabMenuAdapter(FragmentManager FM,名单,其中,片断>的片段,上下文CTX,ArrayList的<字符串> servicesName,ArrayList的<整数GT; servicesImage)
    {
        超(FM);
        this.context =(活动)CTX;
        dataHelper =新DataHelper(CTX);
        menuInfo = dataHelper.getTransMenuInfo();
        dataHelper.close();

        this.services = servicesName;
        this.images = servicesImage;
        this.fragments =片段;
        menuInfo.add(钱包钱包);
        menuInfo.add(报告);
        menuInfo.add(设置);
    }

    @覆盖
    公众诠释getCount将()
    {
        返回fragments.size();
    }
     公众诠释getItemPosition(对象项){
        //片段片段=(片段)项目;
        返回POSITION_NONE;
    }

    @覆盖
    公共片段的getItem(INT位置)
    {
        返回this.fragments.get(位置);
    }
}

类ViewHolder {
    TextView的标题,描述,ReadMore;
}
 

解决方案

这是个例外,它看起来像你正试图执行一个非UI线程,这是被禁止的UI应用程序。尝试与此封装你的UI code(尤其是TestActivity.java:238):

  MenuInterface mInterface =新MenuInterface(){
    @覆盖
    公共无效loadMenu(){
        getActivity()。runOnUiThread(新的Runnable(){
            公共无效的run(){
                loadFragments();
            }
        });
    }
};
 

Problem ::

I have one SherlockFragmentActivity in which i have added six fragments. Now out of six 3 fragments are added based on the conditions.

loading the fragments ::

private void loadFragments()
{
    try
    {
        dataHelper=new DataHelper(this);
        menuInfo=dataHelper.getTransMenuInfo();

        servicesName = new ArrayList<String>();
        servicesImage = new ArrayList<Integer>();

        if(menuInfo.contains("1"))
        {
            servicesName.add(dataHelper.getTransMenu_ModuleName("1"));
            servicesImage.add(R.drawable.icon);
        }
        if(menuInfo.contains("2"))
        {
            servicesName.add(dataHelper.getTransMenu_ModuleName("2"));
            servicesImage.add(R.drawable.icon);
        }
        if(menuInfo.contains("4"))
        {
            servicesName.add(dataHelper.getTransMenu_ModuleName("4"));
            servicesImage.add(R.drawable.icon);
        }

        dataHelper.close();
        servicesName.add("Fragment 4");
        servicesImage.add(R.drawable.wallet);

        servicesName.add("Fragment 5");
        servicesImage.add(R.drawable.reports);

        servicesName.add("Fragment 6");
        servicesImage.add(R.drawable.setting);

        List<Fragment> fragments = getFragments();

        if(fragments!=null && fragments.size()>0)
        {
            actionbartabmenuAdapter = new ActionBarTabMenuAdapter(getSupportFragmentManager(), fragments,this,servicesName,servicesImage);
            awesomePager.setAdapter(actionbartabmenuAdapter);
        }
    }
    catch(SQLiteException e)
    {
        e.printStackTrace();
    }
    catch(NullPointerException e)
    {
        e.printStackTrace();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

Adapter ::

private class ActionBarTabMenuAdapter extends FragmentPagerAdapter  
{
    Activity context;
    Context ctx;
    ArrayList<String> menuInfo;
    private List<Fragment> fragments;
    ArrayList<String> services;
    ArrayList<Integer> images;

    public ActionBarTabMenuAdapter(FragmentManager fm, List<Fragment> fragments,Context ctx,ArrayList<String> servicesName,ArrayList<Integer> servicesImage)
    {
        super(fm);
        this.context=(Activity) ctx;
        dataHelper=new DataHelper(ctx);
        menuInfo=dataHelper.getTransMenuInfo();
        dataHelper.close();

        this.services = servicesName;
        this.images = servicesImage;
        this.fragments = fragments;
        menuInfo.add("Wallet To Wallet");
        menuInfo.add("Reports");
        menuInfo.add("Settings");
    }

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

class ViewHolder {
    TextView Title, Description, ReadMore;
}

In last fragment(i.e. Fragment 6)in which i have one option for updation,now on click of that button i am removing my local database and get the new value from server and store it in my local database.

So before loading the fragments again,i am simply checking the conditions again and create the fragment list accordingly.so basically its not compulsory that fragment will be loaded 6 every time,it can be 3,4 or 5 also.

What i want ::

So i want to add or remove the fragment in view pager inside the fragment.On click of button,if i get the list 4 fragment then it should be 4 display that no. of fragment at that time(by onSwipe or onTabChanged).

What i have tried ?? ::

To achieve this, i have created one Interface with method loadMenu() like this ::

MenuInterface mInterface=new MenuInterface() {
    @Override
    public void loadMenu() {
        loadFragments();
    }
};

Now in the Fragment 6 i have passed the object of Interface from TestActivity(from where i am setting the adapter)

fList.add(SettingsListFragment.newInstance(this,"Settings",extraMessage,mInterface));

Now in Fragment 6's new InstanceMethod i am getting the object and call the loadMenu() method.

But now after applying this mechanism i am getting the following exception ....

Error ::

java.lang.IllegalStateException: Must be called from main thread of process
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1392)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:321)
at com.example.testapp.TestActivity.loadFragments(TestActivity.java:238)
com.example.testapp.TestActivity.access$0(TestActivity.java:193)
at v.ButtonPayActivity$1.loadTransactionMenu(TestActivity.java:596)
at com.example.testapp.home.SettingsListFragment$4.run(SettingsListFragment.java:769)
at java.lang.Thread.run(Thread.java:1019)

EDIT ::

MenuInterface mMenuInterface=new MenuInterface() {
        @Override
        public void loadTransactionMenu() {
            runOnUiThread(new Runnable() {
                public void run() {
                    loadFragments();
                    if(actionbartabmenuAdapter!=null){
                        actionbartabmenuAdapter.notifyDataSetChanged();
                    }
                }
            });
        }
    };

Adapter ::

private class ActionBarTabMenuAdapter extends FragmentStatePagerAdapter  
{
    Activity context;
    Context ctx;
    ArrayList<String> menuInfo;
    private List<Fragment> fragments;
    ArrayList<String> services;
    ArrayList<Integer> images;

    public ActionBarTabMenuAdapter(FragmentManager fm, List<Fragment> fragments,Context ctx,ArrayList<String> servicesName,ArrayList<Integer> servicesImage)
    {
        super(fm);
        this.context=(Activity) ctx;
        dataHelper=new DataHelper(ctx);
        menuInfo=dataHelper.getTransMenuInfo();
        dataHelper.close();

        this.services = servicesName;
        this.images = servicesImage;
        this.fragments = fragments;
        menuInfo.add("Wallet To Wallet");
        menuInfo.add("Reports");
        menuInfo.add("Settings");
    }

    @Override
    public int getCount() 
    {
        return fragments.size();
    }
     public int getItemPosition(Object item) {
        //Fragment fragment = (Fragment)item;
        return POSITION_NONE;
    }

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

class ViewHolder {
    TextView Title, Description, ReadMore;
}

解决方案

From the exception, it looks like you are trying to perform a UI application in a non-UI thread, which is forbidden. Try to encapsulate your UI code (especially TestActivity.java:238) with this :

MenuInterface mInterface=new MenuInterface() {
    @Override
    public void loadMenu() {
        getActivity().runOnUiThread(new Runnable() {
            public void run() {
                loadFragments();
            }
        });
    }
};

这篇关于如何更新片段寻呼机适配器的片段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆