从ViewPager更新片段片段、ViewPager

2023-09-05 06:36:17 作者:Tears(眼泪)

我有一个活动 ViewPager 。我也有一个对话框,将检索与该用户会选择一些项目的列表。现在,我怎么可以更新片段,其中的项目都应该显示连接到该片段为新的看法?

下面是我的 ViewPager 的适配器:

 公共静态类MyAdapter扩展FragmentPagerAdapter {
    公共MyAdapter(FragmentManager FM){
        超(FM);
    }

    @覆盖
    公众诠释getCount将(){
        返回1;
    }

    @覆盖
    公共android.support.v4.app.Fragment的getItem(INT位置){
        开关(位置){
        情况下0:
            返回新片段1();

        默认:
            返回null;
        }
    }
}
 

现在,这里是片段

 公共类片段1扩展片段{

@覆盖
公共无效onActivityCreated(包savedInstanceState){
    // TODO自动生成方法存根
    super.onActivityCreated(savedInstanceState);
}

@覆盖
公共无效的onCreate(包savedInstanceState){
    // TODO自动生成方法存根
    super.onCreate(savedInstanceState);
}

@覆盖
公众的ViewGroup onCreateView(LayoutInflater充气,容器的ViewGroup,
        捆绑savedInstanceState){
    // TODO自动生成方法存根
    ViewGroup中查看=(ViewGroup中)inflater.inflate(R.layout.screen1,集装箱,假);
    }
    返回查看;
}

}
 
ViewPager系列之 打造一个通用的ViewPager

这是我想用来项添加到我的方法片段

 私人无效的addItem(){

    //实例化一个新的行的看法。

    最后的ViewGroup [] newViews =新的ViewGroup [selectedItems.length]


    的for(int i = 0; I< selectedItems.length;我++){
        newViews [I] =(ViewGroup中)LayoutInflater.from(本).inflate(
                    R.layout.animated_layout_item,mContainerView,假);

        //设置在每个新行的文本。
        ((TextView中)newViews [I] .findViewById(android.R.id.text1))的setText(selectedItems [I]);

        //因为mContainerView有安卓animateLayoutChanges设置为true,
        //添加此视图自动动画。

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


        //该行,将删除该行中的X按钮,设定一个点击监听器。
        OnClickListener听者=新MyAddItemListener(newViews [I],mContainerView,本);
        newViews [I] .findViewById(R.id.delete_button).setOnClickListener(听众);

    }


}
 

解决方案   

从ViewPager更新片段

您需要执行 getItemPosition(obj对象)方法。

在调用此方法称为

  notifyDataSetChanged()
 

ViewPagerAdaper 。隐此方法返回 POSITION_UNCHANGED 值,这意味着这样的事情: 片段就是应该这样改变什么。的

所以,如果你需要更新的片段你可以做到这一点:

总是返回 POSITION_NONE getItemPosition()方法。这其中 意思是:片段必须始终重新创建的 您可以创建一些update()方法,将更新 片段(片段将处理自我更新)

的第二个办法示例:

 公共接口可更新{
   公共无效更新();
}


公共类MyFragment扩展片段实现可更新{

   ...

   公共无效更新(){
     //做你的东西
   }
}
 

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

  @覆盖
公众诠释getItemPosition(Object对象){
   MyFragment F =(MyFragment)对象;
   如果(F!= NULL){
      f.update();
   }
  返回super.getItemPosition(对象);
}
 

如果你选择第一种方法它可以是这样的:

  @覆盖
公众诠释getItemPosition(Object对象){
   返回POSITION_NONE;
}
 

注意:这是值得我们去思考关于哪种方法,你会拿起

I have an Activity with a ViewPager. I also have a Dialog that will retrieve a list with some items that the user will choose. Now, how can I update the Fragment where the Items are supposed to display as new views attached to this Fragment?

Here is my ViewPager's adapter:

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;
        }
    }
}

Now, here is the 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;
}

}

This is the method that I want to use to add Items to my 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);

    }


}

解决方案

Update Fragment from ViewPager

You need to implement getItemPosition(Object obj) method.

This method is called when you call

notifyDataSetChanged()

on your ViewPagerAdaper. Implicitly this method returns POSITION_UNCHANGED value that means something like this: "Fragment is where it should be so change anything."

So if you need to update Fragment you can do it with:

Always return POSITION_NONE from getItemPosition() method. It which means: "Fragment must be always recreated" You can create some update() method that will update your Fragment(fragment will handle updates itself)

Example of second approach:

public interface Updateable {
   public void update();
}


public class MyFragment extends Fragment implements Updateable {

   ...

   public void update() {
     // do your stuff
   }
}

And in FragmentPagerAdapter you'll do something like this:

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

And if you'll choose first approach it can looks like:

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

Note: It's worth to think a about which approach you'll pick up.

 
精彩推荐
图片推荐