草庐IT

Android 刷新 fragment 内的 ViewPager

coder 2023-11-28 原文

我试图在发布之前在 SO 内部进行搜索,但我无法理解如何刷新 fragment 中托管的 ViewPager 的内容。 你能帮帮我吗?

谢谢你的时间

这是我的代码。 我有在其中托管 ViewPager 的 fragment Activity 。它显示不同的小部件,ViewPager 显示不同的图像,我在代码中调用从数据库“carosello”返回的图像列表。当我执行搜索时,我调用 refresh() 方法作为托管此 fragment 的主要 Activity 的回调,然后我再次设置所有 View 。适用于 fragment 中的所有信息,但不适用于 ViewPager:始终显示最旧(首次创建)的图像。

public class Page2FamigliaFragment extends Fragment {

//... variable declaration

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {

    // fragment not when container null
    if (container == null) {
        return null;
    }
    // inflate view from layout
    View view = (LinearLayout)inflater.inflate(R.layout.famiglia_page2,container,false);

    //retrieve my object from the main view that host this fragment
    info = ((MainFamiglia)this.getActivity()).getMyObject();

   //run the setup of the view.    
   setUpMyPage2View(view);

   return view;
}

public void setUpMyPage2View(View view)
{
//... inizialization of some other objects and view - i do not show only because is out of topic for this matter
//retrive the image used in the page viewer
    carosello = info.getCarosello();
    parts = carosello.split(",");

    //how many page ??
    int i = parts.length / 3;
    int resto = parts.length % 3;
    int pages = 0;
    if (resto!=0) {
        pages = i + 1;
    } else {
        pages = i;
    }

List<Fragment> fragments = new ArrayList<Fragment>();

  String[] tempArray;
  int startIndex = 0;
  int endIndex = 3;


  if (parts.length <= 3) {

    fragments.add(myCarosello.newInstance(parts));

  } else {


    tempArray = Arrays.copyOfRange(parts, startIndex, endIndex);

    for (int p=0; p < pages; p++) {

        fragments.add(myCarosello.newInstance(tempArray));
        startIndex = endIndex;
        endIndex = ((endIndex+3) > parts.length) ? parts.length : (endIndex+3);
        tempArray = Arrays.copyOfRange(parts, startIndex, endIndex);

    }

  }

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

  pager = (ViewPager) view.findViewById(R.id.viewpager);
  pager.setAdapter(pageAdapter);
  pager.setOnTouchListener(new OnTouchListener() {

      @Override
      public boolean onTouch(View v, MotionEvent event) {
          if(
                  event.getAction() == MotionEvent.ACTION_DOWN &&
                  v instanceof ViewGroup
          ) {
                  ((ViewGroup) v).requestDisallowInterceptTouchEvent(true);
          }
          return false;
      }
  });

}

//i call this method from a callback from the main view for refresh this fragment
public void refresh(){
    //recupero oggetto dalla activity principale
    info = ((MainFamiglia)this.getActivity()).getMyObject();
    pager.getAdapter().notifyDataSetChanged();
    pager.removeAllViews();
    setUpMyPage2View(this.getView());
}
}

这是 pageAdapter 的类

public class MyPageAdapter extends FragmentPagerAdapter {

// fragments to instantiate in the viewpager
   private List<Fragment> fragments;

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

   // return access to fragment from position, required override
   @Override
   public Fragment getItem(int position) {
      return this.fragments.get(position);
   }

   // number of fragments in list, required override
   @Override
   public int getCount() {
      return this.fragments.size();
   }

   public int getItemPosition(Object object) {
        return POSITION_NONE;
}

这是页面查看器中 ImageView 的类

public class myCarosello extends Fragment {

public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
private int numeroImmagini = 0;

public static final myCarosello newInstance(String[] pictures)
{
    myCarosello f = new myCarosello();
    Bundle bdl = new Bundle(1);
    bdl.putStringArray(EXTRA_MESSAGE, pictures);
    f.setArguments(bdl);

    return f;
}

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {

    String[] pictures = getArguments().getStringArray(EXTRA_MESSAGE);
    numeroImmagini = pictures.length;

    View view = (LinearLayout)inflater.inflate(R.layout.carosello,container,false);

    ImageView imageView1 = (ImageView) view.findViewById(R.id.carosello1);
    ImageView imageView2 = (ImageView) view.findViewById(R.id.carosello2);
    ImageView imageView3 = (ImageView) view.findViewById(R.id.carosello3);

    switch (numeroImmagini) {
    case 1:
        imageView1.setImageResource(returnImageResource(pictures[0]));
        imageView2.setVisibility(View.GONE);
        imageView3.setVisibility(View.GONE);
    break;
    case 2:
        imageView1.setImageResource(returnImageResource(pictures[0]));
        imageView2.setImageResource(returnImageResource(pictures[1]));
        imageView3.setVisibility(View.GONE);
    break;
    case 3:
        imageView1.setImageResource(returnImageResource(pictures[0]));
        imageView2.setImageResource(returnImageResource(pictures[1]));
        imageView3.setImageResource(returnImageResource(pictures[2]));
    break;

    }  

    return view;

}

//return the correct resource name
private int returnImageResource(String image)
{
    image = image.replace(" ", "_");
    String filenameArray[] = image.split("\\.");
    image = "img_" + filenameArray[0].toLowerCase();
    int drawableImageId = getActivity().getResources().getIdentifier(image, "drawable", getActivity().getPackageName());
    return drawableImageId;
}
}

最佳答案

感谢this,我已经解决了邮政 将 MyPageAdapter extends FragmentPagerAdapter 更改为 MyPageAdapter extends FragmentStatePagerAdapter

关于Android 刷新 fragment 内的 ViewPager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17549903/

有关Android 刷新 fragment 内的 ViewPager的更多相关文章

  1. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby - 如何在ruby中提取方括号内的内容 - 2

    我正在尝试提取方括号内的内容。到目前为止,我一直在使用它,它有效,但我想知道我是否可以直接在正则表达式中使用某些东西,而不是使用这个删除功能。a="Thisissuchagreatday[coolawesome]"a[/\[.*?\]/].delete('[]')#=>"coolawesome" 最佳答案 差不多。a="Thisissuchagreatday[coolawesome]"a[/\[(.*?)\]/,1]#=>"coolawesome"a[/(?"coolawesome"第一个依赖于提取组而不是完全匹配;第二个利用前瞻和

  4. ruby - block 内的实例评估 - 2

    我有一个Builder类,可让您添加到其中一个实例变量:classBuilderdefinitialize@lines=[]enddeflinesblock_given??yield(self):@linesenddefadd_line(text)@lines现在,我该如何改变它my_builder=Builder.newmy_builder.lines{|b|b.add_line"foo"b.add_line"bar"}pmy_builder.lines#=>["foo","bar"]进入这个?my_builder=Builder.newmy_builder.lines{add_li

  5. ruby - 打印一个范围内的数字 - 2

    我正在尝试使用以下代码打印1到50之间的所有数字:[1..50].each{|n|putsn}但是控制台打印[1..50]我想打印这样的东西1个2个3个4个...50 最佳答案 试试下面的代码:(1..50).each{|n|putsn}问题是您使用的是[]定界符而不是()定界符。 关于ruby-打印一个范围内的数字,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/14528573

  6. ruby-on-rails - FactoryGirl工厂特征内的序列不使用主序列计数器 - 2

    我有以下工厂:FactoryGirl.definedofactory:foodosequence(:name){|n|"Foo#{n}"}trait:ydosequence(:name){|n|"Fooy#{n}"}endendend如果我跑create:foocreate:foocreate:foo,:y我得到Foo1,Foo2,Fooy1。但我想要Foo1,Foo2,Fooy3。我怎样才能做到这一点? 最佳答案 经过smile2day'sanswer的一些提示后和thisanswer,我得出以下解决方案:FactoryGirl.

  7. ruby - 有没有办法匹配两个双引号内的双引号? - 2

    我尝试了以下正则表达式,但它匹配所有双引号:(?>(?这是文本的示例:"[\"mycarslastnight\",\"Burger\",\"Decaf\"shirt\",\"Mocha\",\"marshmallows\",\"CoffeeMission\"]"我要匹配的模式是第2行中双引号之间的双引号 最佳答案 一般来说,我会说:不。给定一个字符串:\"Burger\"\"Decaf\"shirt\"你如何确定哪个\"是多余的(不匹配的)?这个是在Burger之后,还是在Decaf之后,还是一个在shirt之后?还是在任何这些词之

  8. ruby - 有没有办法将 html 刷新到 Sinatra 中的线路 - 2

    我有一个Sinatra应用程序,它有一个长时间运行的进程(网络抓取工具)。我希望应用程序在爬虫运行时而不是在结束时刷新爬虫进度的结果。我已经考虑过fork请求并使用ajax做一些有趣的事情,但这是一个非常基本的单页应用程序,实际上只需要在它发生时将日志输出到浏览器。有什么建议吗? 最佳答案 更新(2012-03-21)从Sinatra1.3.0开始,您可以使用新的流式API:get'/'dostreamdo|out|out旧答案不幸的是,您没有可以简单地刷新到的流(这不适用于Rack中间件)。从路由block返回的结果可以简单地响应

  9. ruby - 为什么括号内的换行符会改变算术结果? - 2

    为什么下面的表达式会这样解析?括号的优先级应该高于换行符,不是吗?3-(1+1)#=>13-(1+1)#=>2省略加号也会让表达式计算为2:3-(11)#=>2如果我声明为连续的换行符(转义)或将加号移动到第一行,则会实现所需的行为:3-(1\+1)#=>13-(1+1)#=>1 最佳答案 这是因为Ruby将新行识别为表达式的结尾,除非表达式不完整。例如,(1+1)与相同(1;+1)这与+1相同,因为返回了括号内的最后一个表达式。这进一步与1相同。如果行尾有+,则表达式不完整,因此会继续到下一行。这使得:3-(1+1)被解释为3-(

  10. ruby - Chef - 提供者内的模板找不到源 - 2

    我有一些nginx站点的资源和提供程序,它可以为站点写出配置文件。action:startdotemplate"/etc/nginx/sites-enabled/my_site"dosource"nginx_site.conf.erb"notifies:reload,"service[nginx]"endend当我从另一本Recipe中使用它时,找不到模板nginx_site.conf.erb,因为Chef正在寻找调用此资源的模板。有没有办法告诉Chef在nginx资源和提供者Recipe中寻找模板? 最佳答案 您可以为templa

随机推荐