Android 如何从片段更新片段寻呼机适配器?
问题::Android 如何从片段更新片段寻呼机适配器?,android,android-fragments,android-viewpager,fragmentpageradapter,Android,Android Fragments,Android Viewpager,Fragmentpageradapter,问题:: private void loadFragments() { try { dataHelper=new DataHelper(this); menuInfo=dataHelper.getTransMenuInfo(); servicesName = new ArrayList<String>(); servicesImage = new ArrayList<Integer>();
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();
}
}
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)
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;
}
我有一个SherlockFragmentActivity,其中我添加了六个片段。
现在,在6个碎片中,有3个是根据条件添加的
加载片段::
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();
}
}
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)
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;
}
现在在片段6中,我已经从TestActivity(我正在设置适配器的地方)传递了接口对象
现在,在片段6的新InstanceMethod中,我获得了对象并调用loadMenu()
方法
但是现在在应用这个机制之后,我得到了以下例外
错误::
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();
}
}
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)
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;
}
编辑::
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;
}
MenuInterface mMenuInterface=new MenuInterface() {
@Override
public void loadTransactionMenu() {
runOnUiThread(new Runnable() {
public void run() {
loadFragments();
if(actionbartabmenuAdapter!=null){
actionbartabmenuAdapter.notifyDataSetChanged();
}
}
});
}
};
适配器::
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();
}
}
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)
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;
}
私有类ActionBarTabMenuAdapter扩展了FragmentStatePagerAdapter
{
活动语境;
上下文ctx;
ArrayList menuInfo;
私有列表片段;
ArrayList服务;
阵列图像;
公共操作BartabMenuAdapter(FragmentManager格式、列表片段、上下文ctx、ArrayList服务名称、ArrayList服务图像)
{
超级(fm);
this.context=(Activity)ctx;
dataHelper=新的dataHelper(ctx);
menuInfo=dataHelper.getTransMenuInfo();
dataHelper.close();
this.services=servicesName;
this.images=servicesImage;
this.fragments=片段;
menuInfo.add(“钱包到钱包”);
menuInfo.add(“报告”);
menuInfo.add(“设置”);
}
@凌驾
public int getCount()
{
返回fragments.size();
}
public int getItemPosition(对象项){
//片段=(片段)项;
返回位置\无;
}
@凌驾
公共片段getItem(int位置)
{
返回此.fragments.get(位置);
}
}
类视图持有者{
文本视图标题、说明、阅读更多;
}
从异常情况看,您似乎试图在非UI线程中执行UI应用程序,这是被禁止的。尝试用以下内容封装您的UI代码(尤其是TestActivity.java:238):
MenuInterface mInterface=new MenuInterface() {
@Override
public void loadMenu() {
getActivity().runOnUiThread(new Runnable() {
public void run() {
loadFragments();
}
});
}
};
我得到了同样的例外。我脑海中浮现的问题是,我是否需要使用FragmentStatePagerAdapter而不是FragmentPagerAdapter来实现所需的结果。如果是,那么如何在适配器中动态添加/删除片段?请指导我。FragmentStatePagerAdapter和FragmentPagerAdapter的主要区别在于内存管理:FragmentPagerAdapter加载所有片段并将其保存在内存中,而不是FragmentStatePagerAdapter。所以,如果你有固定数量的片段,请转到FragmentPagerAdapter,或者转到FragmentStatePagerAdapter。顺便说一句,我已经编辑了我的答案。你能测试一下吗?我已经添加了你的代码,它工作得很好,但我的问题是,如果我在点击更新后得到要加载的4个片段,我的标签就不会重新生成。我使用的是片段状态寻呼机适配器,所以我的实现有什么问题吗?我仍然不知道如何使用getItemPosition()动态添加或删除片段适配器的方法。你能帮我这个方向吗?我已经编辑了我的代码。请看一看。正如我所说,如果您使用FragmentStatePagerAdapter,那么片段不会保存在内存中,因此您需要重新生成它们,例如Fragment.instantiate(上下文、fragmentClassName、fragmentArgs);请你给我看一下我的数据表中的一些代码片段,它们可以帮助我实现。