Как я могу заполнить адаптер во фрагменте, который находится внутри viewPager внутри dialogFragment? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь создать следующий сценарий:

Пользователь нажимает Button>, это показывает DialogFragment DialogFragment содержит ViewPager, который имеет 2 вкладки - одна показываетфрагмент выбора цвета и другой фрагмент выбора символа. Каждый фрагмент выбора содержит адаптер, который преобразует массив цветов / символов в красивую сетку.

Однако в настоящее время он отображается пустым - появляется DialogFragment сдругие части фрагмента, но без представления адаптера.

Вот что у меня есть:

Начальное действие называется EditActivity.У него есть Button, который при нажатии вызывает эту функцию, чтобы показать, что DialogFragmentPickers:

public void showPickers() {
        if(mDialogFragmentPickers == null) return;
        mDialogFragmentPickers.setColourSet(mColourSet);
        mDialogFragmentPickers.show(mFragmentManager, "Pickers");
    }

DialogFragmentPickers инициализируется в методе onCreate EditActivity следующим образом:

mDialogFragmentPickers = new DialogFragmentPickers();

Передаваемый ColourSet - это просто массив цветов, которые должны отображаться в средстве выбора.DialogFragmentPickers должен затем передать его в FragmentColourPicker при инициализации.

Класс DialogFragmentPickers выглядит следующим образом (я показал только части, относящиеся к ColourPicker, но SymbolPicker работает аналогично):

public class DialogFragmentPickers extends DialogFragment {

    private PickersPagerAdapter mPagerAdapter;
    private ViewPager           mViewPager;
    private ColourSet           mColourSet;
    private FragmentColourPicker    mColourPicker;

    @Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container,
            Bundle savedInstanceState) {

        // Inflate layout
        View view = inflater.inflate(R.layout.dialog_fragment_pickers, container, false);

        mPagerAdapter = new PickersPagerAdapter(getChildFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = view.findViewById(R.id.pager);
        mViewPager.setAdapter(mPagerAdapter);

        return view;

    }

    public void setColourSet(ColourSet colourSet) {
        mColourSet = colourSet;
        if(mColourPicker == null) getColourPickerFragment();
        else mColourPicker.setColourSet(mColourSet);
    }

    private void getColourPickerFragment() {
        if (mPagerAdapter == null) return;
        mColourPicker = (FragmentColourPicker) mPagerAdapter.getItem(0);
        if(mColourSet != null) mColourPicker.setColourSet(mColourSet);
    }

    public class PickersPagerAdapter extends FragmentPagerAdapter
    {

        PickersPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch(position) {
                case 0:
                    return new FragmentColourPicker();
                case 1:
                    return new FragmentSymbolPicker();
                default:
                    return null;
            }
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return getResources().getString(R.string.colours);
                case 1:
                    return getResources().getString(R.string.symbols);
            }
            return null;
        }
    }

Файл макета для этого содержит:

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- Current + adjacent page titles...-->
    <android.support.v4.view.PagerTitleStrip
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#33b5e5"
        android:paddingBottom="4dp"
        android:paddingTop="4dp"
        android:textColor="#fff" />
</android.support.v4.view.ViewPager>

Первый фрагмент, использованный в этом пейджере, - FragmentColourPicker.Он определяется следующим образом:

public class FragmentColourPicker extends Fragment {

    GridView mColourGrid;
    Context mContext;
    ColourSet mColourSet;
    ChartColourAdapter mColourAdapter;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_colour_picker, container, false);

        mColourGrid = view.findViewById(R.id.gridview_colourPicker);

        initialiseWithColourSet(); // Returns without doing anything if colourSet is not set up yet

        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mContext = getActivity();

    }

    @Override
    public void onDestroy(){ super.onDestroy();}

    public void setColourSet(ColourSet thisColourSet) {
        mColourSet = thisColourSet;
        initialiseWithColourSet(); // Returns without doing anything if the colourGrid is not set up yet
    }

    public void initialiseWithColourSet() {

// Make sure that the colourSet and the colourGrid have both been initialised
        if(mColourSet == null) return;
        if(mColourGrid == null) return;

        // Now set up ChartColourAdapter to display colours in grid
        // Initialise currently highlighted colour to default
        // Set on click listener for each colour
        mColourAdapter = new ChartColourAdapter(mContext,
                R.layout.adapter_pattern_colour_cell_layout,
                mColourSet.getColours());
        mColourGrid.setAdapter(mColourAdapter);

    }

}

и файл макета для FragmentColourPicker (frag_colour_picker.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/colour_picker_fragment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/fui_transparent"
    android:orientation="vertical">

    <GridView 
        android:id="@+id/gridview_colourPicker"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorBg"
        android:paddingBottom="@dimen/activity_standard_margin"
        android:columnWidth="@dimen/grid_cell_column_width"
        android:gravity="center"
        android:horizontalSpacing="10dp"
        android:numColumns="auto_fit"
        android:padding="@dimen/activity_small_margin"
        android:stretchMode="columnWidth"
        android:verticalSpacing="10dp" />

    <TextView
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:text="@string/prompt_swipe_for_symbols"
        android:padding="@dimen/activity_small_margin"
        android:background="@color/colorBg"
        />

</LinearLayout>

Когда я запускаю все это, появляется DialogFragmentкогда кнопка нажата, и показывает FragmentColourPicker.Я могу провести до FragmentSymbolPicker и обратно.Однако единственное, что отображается в ColourPicker - это TextView, который предлагает пользователю провести пальцем по экрану, чтобы увидеть символы.GridView с фактическими цветами в нем вообще не отображается.

Из отладчика, я думаю, проблема в том, что initialiseWithColourSet, кажется, только когда-либо имеет colourSet ИЛИ colourGrid.- Никогда оба.Это возвращает его, не пытаясь настроить цветовой адаптер.

Если onCreateView вызывается initialiseWithColourSet, тогда устанавливается colourGrid, а colourSet - нет (так как он еще не был передан),Это достаточно разумно.Однако, когда colourSet передается позже (из DialogFragment), colourGrid возвращается к нулю, поэтому снова функция возвращается, ничего не делая.

У меня явно что-то не в том порядке, или яинициализация colourGrid / ColourPicker без ее реализации.

1 Ответ

0 голосов
/ 21 декабря 2018

Похоже, проблема заказа для меня.Чтобы убедиться, что вы получаете ваши данные в Fragment в нужное время, я бы передал данные, необходимые фрагментам, в Adapter через конструктор.Я бы сохранил ссылку на них, а затем создал бы фрагменты, используя статический метод newInstance(... requiredData).Затем вы можете быть уверены, что когда они «созданы» адаптером, они будут иметь необходимую информацию.

Примерно так:

Ваш класс фрагментов:

...

Object myRequiredData;

static FragmentColourPicker newInstance(... requiredData) {
   FragmentColourPicker f = new FragmentColourPicker();
    f.setRequiredData(requiredData);        

    return f;
}

public void setRequiredData(Object reqData){
    this.myRequiredData = reqData;
}

...

Ваш класс адаптера:

public class PickersPagerAdapter extends FragmentPagerAdapter {

        Object reqData0;
        Object reqData1;

        PickersPagerAdapter(FragmentManager fm, Object reqData0, Object reqData1) {
            super(fm);
            this.reqData0 = reqData0;
            this.reqData1 = reqData1;
        }

        @Override
        public Fragment getItem(int position) {
            switch(position) {
                case 0:
                    return FragmentColourPicker.newInstance(reqData0);
                case 1:
                    return FragmentSymbolPicker.newInstance(reqData1);
                default:
                    return null;
            }
        }

    ...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...