Как инициализировать просмотр макроса в viewpager с помощью компонента привязки данных - PullRequest
0 голосов
/ 16 апреля 2019

Я создаю приложение, которое использует некоторые компоненты android jetpack, и у меня возникают проблемы с использованием компонента привязки данных, чтобы создать дескриптор для моих обзоров переработчиков.

По сути, у меня есть фрагмент просмотра внутри фрагмента, который имеет две статические компоновки в виде страниц. Сами страницы не являются фрагментами, потому что я не хотел вкладывать фрагменты. Тем более, что я буду делать перетаскивание с одной страницы на другую (пока только в альбомном режиме). В ландшафтном режиме обе страницы видны. На обеих страницах есть повторы просмотра, с которыми я хочу взаимодействовать (заполнить, обновить .. и т. Д.)

Вопрос, который у меня возник, заключается в том, где я могу инициализировать привязку утилит, чтобы у меня была ручка для ее заполнения?

Я знаю, что могу создать поле для каждого класса привязки данных в PageAdapter и создать экземпляры привязок для инфляции моих страниц, но лучше ли это поместить? Есть ли лучший вариант?

fragment_home.xml

<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".ui.views.HomeFragment">
    <data>
    </data>
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />
</layout>

page1.xml

<layout>
        <data>

        </data>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical" android:layout_width="match_parent"
            android:layout_height="match_parent">
                <TextView
                    android:id="@+id/header"
                    android:text="Page 1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textAlignment="center"
                    android:textStyle="bold"
                    android:background="?android:attr/colorPrimary"
                    android:paddingTop="8dp"
                    android:paddingBottom="8dp"
                    />

                <androidx.recyclerview.widget.RecyclerView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:id="@+id/recycler1"
                    android:layout_weight="1"/>
        </LinearLayout>
</layout>

page2.xml

<layout>
        <data>

        </data>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical" android:layout_width="match_parent"
            android:layout_height="match_parent">
                <TextView
                    android:id="@+id/header2"
                    android:text="Page 2"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textAlignment="center"
                    android:textStyle="bold"
                    android:background="?android:attr/colorPrimary"
                    android:paddingTop="8dp"
                    android:paddingBottom="8dp"
                    />

                <androidx.recyclerview.widget.RecyclerView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:id="@+id/recycler2"
                    android:layout_weight="1"/>
        </LinearLayout>
</layout>

HomeFragment.java

public class HomeFragment extends Fragment {

    FragmentHomeBinding homeBinding;

    public HomeFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        homeBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false);
        return homeBinding.getRoot();
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState){
        super.onViewCreated(view,savedInstanceState);
        homeBinding.homePager.setAdapter(new HomePageAdapter(getContext()));
    }
}

HomePageAdapter.java

public class HomePageAdapter extends PagerAdapter {
    public enum HomePages {

        PAGE1(R.string.page1_title, R.layout.page1),
        PAGE2(R.string.page2_title, R.layout.page2);

        private int mTitleResId;
        private int mLayoutResId;

        HomePages(int titleResId, int layoutResId) {
            mTitleResId = titleResId;
            mLayoutResId = layoutResId;
        }

        public int getTitleResId() {
            return mTitleResId;
        }

        public int getLayoutResId() {
            return mLayoutResId;
        }

    }

    private Context mContext;

    public HomePageAdapter(Context context){
        this.mContext = context;
    }

    @Override
    public int getCount() {
        return HomePages.values().length;
    }

    @Override
    public Object instantiateItem(ViewGroup collection, int position) {
        HomePages page = HomePages.values()[position];
        LayoutInflater inflater = LayoutInflater.from(mContext);
        ViewGroup layout = (ViewGroup) inflater.inflate(page.getLayoutResId(), collection, false);
        collection.addView(layout);
        return layout;
    }

    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        collection.removeView((View) view);
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        HomePages page = HomePages.values()[position];
        return mContext.getString(page.getTitleResId());
    }

    @Override
    public float getPageWidth(int position) {
        boolean hasTwoPanes = mContext.getResources().getBoolean(R.bool.hasTwoPanes);
        return hasTwoPanes ? 0.5f : 1.0f;
    }

}

Кредиты: https://www.bignerdranch.com/blog/viewpager-without-fragments/

...