ViewPager,动态添加片段不起作用

ViewPager, dynamically adding fragments is not working

在我的应用程序中,我试图打开一个 excel 文件并为每行数据创建一个选项卡。打开文件并获取数据工作正常,但如果我尝试添加页面,则会出现以下异常:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: dsv.testanwendung, PID: 19699
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

我已经尝试过只在 instantiateItem 中添加当前没有父级的视图,但是不知何故,当我滑动到它的页面时,视图会立即被删除。

这是我的 PagerAdapter class:

package dsv.testanwendung;

import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;

public class PagerAdapterContent extends PagerAdapter {
    private ArrayList<View> views = new ArrayList<View>();

    @Override
    public int getItemPosition(@NonNull Object object) {
        int index = views.indexOf(object);
        if (index == -1) {
            return POSITION_NONE;
        } else {
            return index;
        }
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        View v = views.get(position);
        container.addView(v);
        return v;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(views.get(position));
    }

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

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    public int addView(View v) {
        return addView(v, views.size());
    }

    public int addView(View v, int position) {
        views.add(position, v);
        notifyDataSetChanged();
        return position;
    }

    public int removeView(ViewPager pager, View v) {
        return removeView(pager, views.indexOf(v));
    }

    public int removeView(ViewPager pager, int position) {
        pager.setAdapter(null);
        views.remove(position);
        pager.setAdapter(this);
        return position;
    }

    public View getView(int position) {
        return views.get(position);
    }
}

下面是我尝试通过我的主 activity 添加内容的方法:

viewpageContent = findViewById(R.id.vpContent);
adapterContent = new PagerAdapterContent();
vpContent.setAdapter(adapterContent);
LayoutInflater inflater = getLayoutInflater();
FrameLayout fl = (FrameLayout)inflater.inflate(R.layout.fragment_content, null, false);
while (rowIterator.hasNext()) {
    HSSFRow row = (HSSFRow)rowIterator.next();
    ((InputUserDefined)f).addButton(row.getCell(0).toString());
    int pageIndex = adapterContent.addView(fl);
}

使用StatePagerAdapter更新数据调用适配器的notifyDataSetChanged方法

试试这个

while (rowIterator.hasNext()) {
  LayoutInflater inflater = getLayoutInflater();
FrameLayout fl = (FrameLayout)inflater.inflate(R.layout.fragment_content, null, false);
    HSSFRow row = (HSSFRow)rowIterator.next();
    ((InputUserDefined)f).addButton(row.getCell(0).toString());
    int pageIndex = adapterContent.addView(fl);
}