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

使用FragmentPageAdapter动态添加、删除碎片的android视页

祝锐
2023-03-14

我有一个带有tabhost和ViewPager的应用程序。我有一个标签,碎片作为固定。我必须添加标签,片段动态地在radiogroup中单击单选按钮从第一个片段。

MyPagerAdapter类:

import java.util.ArrayList;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;

public class MyViewPageAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments = new ArrayList<Fragment>();
    FragmentManager fm;

    public List<Fragment> getFragments() {
        return fragments;
    }

    public void setFragments(List<Fragment> fragments) {
        this.fragments = fragments;
    }

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

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    public void addFragment(Fragment fragment) {
        this.fragments.add(fragment);
        notifyDataSetChanged();
    }

    public void removeFragments() {
        try {
            List<Fragment> newList = new ArrayList<Fragment>();
            Fragment general = fragments.get(0);
            newList.add(general);           
            this.fragments.clear();
            this.fragments = new ArrayList<Fragment>();
            this.fragments = newList;
            notifyDataSetChanged();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void removeItemFromFrament(ViewGroup container, int position, Object object) {
        try {
            try {
                container.removeViewAt(position);
                ((ViewPager) container).setCurrentItem(position - 1);               
            } catch (Exception e) {
                e.printStackTrace();
            }
            notifyDataSetChanged();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

MyPagerFragment类:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MyViewPageFragment extends Fragment {

    private static View mView;

    public static final MyViewPageFragment newInstance(int layoutId) {
        MyViewPageFragment f = new MyViewPageFragment();
        Bundle b = new Bundle();
        b.putInt("layout", layoutId);
        f.setArguments(b);
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        int layout = getArguments().getInt("layout");
        try {
            mView = inflater.inflate(layout, container, false);
        } catch (Exception e) {
        }
        return mView;
    }

}
Fragment fragment = MyViewPageFragment.newInstance(R.layout.tab_content_layout);
((MyViewPageAdapter) mViewPager.getAdapter()).addFragment(fragment);

我的问题是:第一次,页面添加正确,删除所有视图(第一个片段除外)并尝试添加另一组选项卡后,视图的片段不可见,getSupportFragmentManager.getFragment().size()不正确。

我试图用片段管理器从viewpager中删除视图

FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();

添加选项卡后,pagescrolled上的片断将getSupportFragmentManager().getFragments.get(arg0)返回null。

注意:我必须维护第一个片段的状态,所以FragmentStatePagerAdapter和getItemPosition返回POSITION_NONE是不可接受的。

共有1个答案

马哲
2023-03-14

就像您没有从ListAdapter中专门调用ListView来删除项一样,您也没有直接从FragmentManager中用FragmentPagerAdapter删除Fragment

您必须重写getitemposition(),但是您必须提供比总是返回position_none更智能的实现。

如果您的第一个片段从未更改,那么在将该片段传递给getitemposition()时,始终返回position_unctions

将其视为您与viewpager/fragmentPagerAdapter之间的对话。这里有一个例子:

你:“我需要改变周围的碎片。”(调用NotifyDataSetChanged)

适配器:“注意,我现在要改变周围的一切。”(回调startupdate)

适配器:“您想要多少个选项卡?”(回调getcount())

你:三个。(返回'3')

你:“我想把那个留在原地。”(返回position_unctions)

适配器:“太好了,那第二个呢?”(回调getitemposition)

你:“我想把它移到第三个标签。”(返回'2')

你:“我想彻底摆脱那一个。”(返回位置_none)

适配器:“好的,我有第二个标签页的空间,你想让我使用什么片段?”(回调getitem)

你:“这个。”(返回位置==1)

我可能没有完全正确的调用顺序,但基本思想是存在的。

如果需要维护被踢出的片段的状态,可以重写getitem()destroyitem()来帮助您:

private FragmentManager mFragmentManager;

public MyPagerAdapter(FragmentManager fm) {
    super(fm);
    mFragmentManager = fm;
}

@Override
public Fragment getItem(int position) {
    // figure out which fragment you want at this position
    Fragment fragment = new MyFragment();
    // retrieve your savedState from wherever you put it
    fragment.setInitialSavedState(savedState);
    return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    Fragment fragment = (Fragment) object;
    Fragment.SavedState savedState = mFragmentManager.saveFragmentInstanceState(fragment)
    // save your fragment state somewhere here
    super.destroyItem(container, position, object);
}

您的片段需要实现savestaste()restoreState()才能起作用。

 类似资料:
  • 当我添加fragment并使用以下代码从Fragment1转到Fragment2时: 当我从Fragment2回来时,我无法在Fragment1中检查暂停和毁灭,在Fragment1中检查恢复。我想用添加来做这件事,而不是用替换。请帮帮我。谢啦

  • 问题内容: 我正在尝试添加/删除表行。 这是我的代码: HTML表格 JavaScript 现在,如您所见,在我的表格中,我有文本字段和按钮。我想要的是: 仅重复行的结构。我现在无法执行此操作,因为innerHTM仅接收文本。如何插入文本框或标签? 文本字段的ID也应该不同,因为稍后我将检索这些值以将其放入数据库中。 我想放置一个函数以增加POI的数量 有人可以帮我吗? 问题答案: 您可以仅克隆具

  • 我可以使用一个片段作为一个活动吗?我已经创建了一个片段,但我希望它有像活动一样的功能,所以我使用片段扩展碎片活动。然而,我有一个带有碎片的导航抽屉。当我更改为“扩展碎片活动”时,我的代码有问题?请给我指路。

  • 我遇到的问题是,我需要完全删除中保存的一些。 我已经对它进行了修复,但是旧的片段似乎仍然完好无损。 建筑施工

  • 问题内容: 我使用指令创建联系表格。最初我创建用于显示客户表单的customerForm指令。在这种形式下,我有一个按钮,当我们单击添加按钮时,称为getData函数,该函数内部使用newDirective显示ul列表。为此,我使用$ compile api编译html代码。很好,当我们单击“删除”按钮时,它也显示列表值和“删除”按钮,它称为scope.remove()函数。但是它只能删除一个。之

  • 这似乎是一个具有挑战性的动画,但我有一种感觉,这可以很容易地完成。我正在尝试实现如下所示的片段之间的动画(请参阅第二和第三象限) 进入和退出并不难,但是预显示下一张和上一张卡片的屏幕以及无缝切换到下一张卡片超出了我的知识范围。如果有人制作过类似的动画,请给我一些指点。 编辑 Android的官方文档在点击时过渡,即当用户点击页面缩小以显示最后一页和上一页时,滑动将其移动到下一页。我的要求是将页面保