当前位置: 首页 > 知识库问答 >
问题:

Android刷新片段内的视页

干照
2023-03-14

我试着在发帖前在里面搜索,但我不能理解如何刷新片段中托管的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());
}
}
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;
}

}

这是pageviewer中的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;
}
}

共有1个答案

谢涵亮
2023-03-14

由于将MyPageAdapter extends FragmentPagerAdapter更改为MyPageAdapter extends FragmentStatePagerAdapter,我已经解决了这个问题。

 类似资料:
  • 问题内容: 我搜索了许多看起来像这样的问题,但没有找到我的答案。 我有一个活动,该活动具有3个可通过操作栏访问的选项卡。我通过添加3个片段来实现这一点,这些片段使我自定义视图扩展了视图类。 在数据库更改的那一刻,我尝试通过调用invalidate()/ postinvalidate()刷新选项卡中的视图,但这不起作用。正如我考虑的其他许多选项一样,调用片段的onCreateView也是如此。 但是

  • 似乎刷新问题之前讨论过,但没有一个解决方案对我有效。 我正在尝试做的事情:我正在使用FragmentStatePagerAdapter。适配器的每个位置都保存一个片段,该片段具有类似国际象棋的线性布局,每个单元格由CheckedTextView表示。 问题:即使正确存储和分配了值,视图仍然不能刷新,视图中单元格的值也不会得到更新。 我尝试过的建议都不起作用:1。调用Adapter.NotifyDa

  • 我遇到了一个如何在对话框片段中更新片段的问题。 当我单击过滤器菜单按钮时,会显示一个新的对话框片段,其中包括一个无线电组。 我想在单击ok按钮时更新包含位置列表的片段。 它是PlaceActive的代码,其中包含PlaceFraank: 公共类PlaceActive扩展AppCompatActive{ } 以下是PlaceFragment类的代码: 公共类PlaceFragment扩展了片段{ }

  • 问题内容: 我想刷新一个列表视图。当我从另一个类获取值时,我希望它将其更新为列表视图。我正在创建用于刷新列表的线程,但出现异常: 如何进行? 问题答案: 无需尝试刷新视图以更新列表,只需采用Adapter对象并调用notifyDataSetChanged()API。

  • 我有Mainactive,它保存片段。我的一个片段(参与者)检查数据库中是否有任何内容。如果没有,则显示带有消息以添加数据的片段(空参与者列表)。如果是,它显示带有2个选项卡的TabHost片段,其中一个包含带有数据库条目的ListView片段(参与者列表)。有一个FAB按钮可以添加更多记录。添加另一条记录后如何刷新ListView?我不确定,因为TabHost不适用于我在应用程序中使用的Frag

  • 我设法创建了一个自定义列表视图,并为每一行添加了一个删除按钮。删除按钮运行良好,当我单击按钮时,该行会从数据库中删除。问题是,当我删除一行时,它会保留在列表中,直到我通过移动到另一个片段来刷新片段并返回,然后它从列表中消失。我想要的是,当我删除一行时,它会立即从列表视图中消失。我尝试了一些解决方案来刷新整个片段或删除完成后的列表视图,但它们不起作用! 这是我为适配器类中的删除按钮编写的代码 之后