从ViewPager更新片段

Lui*_*eri 52 android android-fragments android-viewpager

我有Activity一个ViewPager.我还有一个Dialog将检索列表,其中包含用户将选择的一些项目.现在,如何更新Fragment项目应显示的位置作为附加到此片段的新视图?

这是我ViewPager的适配器:

public static class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return 1;
    }

    @Override
    public android.support.v4.app.Fragment getItem(int position) {
        switch (position) {
        case 0:
            return new Fragment1();

        default:
            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这是Fragment:

public class Fragment1 extends Fragment{

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
}

@Override
public ViewGroup onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    ViewGroup view = (ViewGroup)inflater.inflate(R.layout.screen1, container, false);
    }
    return view;
}

}
Run Code Online (Sandbox Code Playgroud)

这是我想用来向我添加项目的方法 Fragment

private void addItem() {

    // Instantiate a new "row" view.

    final ViewGroup[] newViews = new ViewGroup[selectedItems.length];


    for(int i = 0; i < selectedItems.length; i++){
        newViews[i] = (ViewGroup) LayoutInflater.from(this).inflate(
                    R.layout.animated_layout_item, mContainerView, false);

        // Set the text in each new row.
        ((TextView) newViews[i].findViewById(android.R.id.text1)).setText(selectedItems[i]);

        // Because mContainerView has android:animateLayoutChanges set to true,
        // adding this view is automatically animated.

            mContainerView.addView(newViews[i], 0);


        // Set a click listener for the "X" button in the row that will remove the row.
        OnClickListener listener = new MyAddItemListener(newViews[i], mContainerView, this);
        newViews[i].findViewById(R.id.delete_button).setOnClickListener(listener);

    }


}
Run Code Online (Sandbox Code Playgroud)

Sim*_*iak 124

从ViewPager更新片段

你需要实现getItemPosition(Object obj)方法.

调用时会调用此方法

notifyDataSetChanged()
Run Code Online (Sandbox Code Playgroud)

在你的ViewPagerAdaper.隐含地,这个方法返回的POSITION_UNCHANGED值意味着类似这样的东西: "片段应该是它应该在哪里,所以不要改变任何东西."

因此,如果您需要更新Fragment,您可以执行以下操作:

  • 始终POSITION_NONEgetItemPosition()方法返回.它意味着:"片段必须始终重新创建"
  • 你可以创建一些update()方法来更新你的Fragment(片段将自己处理更新)

第二种方法的例子:

public interface Updateable {
   public void update();
}


public class MyFragment extends Fragment implements Updateable {

   ...

   public void update() {
     // do your stuff
   }
}
Run Code Online (Sandbox Code Playgroud)

在FragmentPagerAdapter中你会做这样的事情:

@Override
public int getItemPosition(Object object) {
   MyFragment f = (MyFragment ) object;
   if (f != null) {
      f.update();
   }
  return super.getItemPosition(object);
}
Run Code Online (Sandbox Code Playgroud)

如果您选择第一种方法,它可能看起来像:

@Override
public int getItemPosition(Object object) {
   return POSITION_NONE;
}
Run Code Online (Sandbox Code Playgroud)

注意:值得考虑一下你会选择哪种方法.

  • @LuisLavieri你应该像`yourPager.getAdapter().notifyDataSetChanged()一样调用它 (4认同)
  • 美丽.经过努力,它终于奏效了.谢谢哥们儿.问题是我的`mContainerView`; 它没有得到适当的实例化. (2认同)
  • +1 for @Override public int getItemPosition(Object object){return POSITION_NONE; } (2认同)

Yog*_*dra 28

我有时会遇到问题所以在这种情况下总是避免使用FragmentPagerAdapter并使用FragmentStatePagerAdapter.

它对我有用.我希望它也适合你.


li2*_*li2 15

我按照Sajmon的回答实现了一个app演示.只是为了搜索这个问题的其他人.

您可以在GitHub上访问源代码

在此输入图像描述


mad*_*527 12

在PagerAdapter中覆盖getItemPosition

@Override
public int getItemPosition(Object object) {
// POSITION_NONE makes it possible to reload the PagerAdapter
return POSITION_NONE;
}
Run Code Online (Sandbox Code Playgroud)

之后添加viewPager.getAdapter().notifyDataSetChanged(); 这段代码如下

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            viewPager.getAdapter().notifyDataSetChanged();
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
Run Code Online (Sandbox Code Playgroud)

应该管用.

  • 它有效,但在选项卡之间滑动时 UI 开始变慢。谢谢。 (2认同)

Cab*_*zas 5

您可以通过两种不同的方式更新片段,

第一种方式

像@Sajmon

你需要实现getItemPosition(Object obj)方法。

调用时会调用此方法

notifyDataSetChanged()
Run Code Online (Sandbox Code Playgroud)

您可以在Github 中找到一个示例,并在这篇文章中找到更多信息。

在此处输入图片说明

第二种方式

我在 viewpager 中更新片段的setTag()方法是将该方法用于方法中的任何实例化视图instantiateItem()。因此,当您想要更改数据或使您需要的视图无效时,您可以调用findViewWithTag()ViewPager 上的方法来检索先前实例化的视图并根据需要修改/使用它,而无需每次删除/创建新视图想要更新一些值。

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Object object = super.instantiateItem(container, position);
    if (object instanceof Fragment) {
        Fragment fragment = (Fragment) object;
        String tag = fragment.getTag();
        mFragmentTags.put(position, tag);
    }
    return object;
}

public Fragment getFragment(int position) {
    Fragment fragment = null;
    String tag = mFragmentTags.get(position);
    if (tag != null) {
        fragment = mFragmentManager.findFragmentByTag(tag);
    }
    return fragment;
}
Run Code Online (Sandbox Code Playgroud)

你可以在Github 中找到一个例子,或者在这篇文章中找到更多信息:

在此处输入图片说明