ViewPager, динамическое добавление фрагментов не работает - PullRequest
0 голосов
/ 19 февраля 2019

В моем приложении я пытаюсь открыть файл 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:

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

А вот как я пытаюсь добавить материал черезмоя основная деятельность:

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

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

попробуйте

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);
}
0 голосов
/ 19 февраля 2019

Используйте StatePagerAdapter и для обновления данных вызовите метод notifyDataSetChanged адаптера.

...