Я создаю приложение, которое использует некоторые компоненты 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/