Пользовательский интерфейс во фрагменте не обновляется должным образом - PullRequest
0 голосов
/ 21 января 2020

Я использую привязку данных + viewpager + фрагмент. Я установил два фрагмента. Оба фрагмента имеют одинаковый макет с разными именами. Проблема в том, что флажок во фрагменте 2 не может корректно обновляться, когда я установил ObservableBoolean, в то время как фрагмент 1 в порядке. Он не находится ни в проверенном, ни в непроверенном состоянии. Это в очень странном состоянии (см. Изображение ниже). Я думаю, это вызвано ViewPager. Но понятия не имею, как это исправить.

Изображение, показывающее неправильное состояние чекбокса Ниже приведен код. MainAcitivty. java

package com.jone.tablayouttest;

import android.arch.lifecycle.ViewModelProviders;
import android.databinding.BindingAdapter;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.jone.tablayouttest.databinding.ActivityMainBinding;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private ActivityMainBinding mBinding;

    private ViewPager viewPager;
    List<Fragment> mFragments = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        mBinding.setHandler(this);
        mBinding.setManager(getSupportFragmentManager());

//        mFragments.add(Fragment1.newInstance());
//        mFragments.add(Fragment2.newInstance());

        viewPager = mBinding.vpContent;

//        viewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) {
//            @Override
//            public Fragment getItem(int position) {
//                return mFragments.get(position);
//            }
//
//            @Override
//            public int getCount() {
//                return mFragments.size();
//            }
//
//            @Override
//            public int getItemPosition(Object object) {
//                Log.d(TAG, "getItemPosition");
//                return POSITION_NONE;
//            }
//        });
    }

    static public ViewModel1 obtainViewModel1(FragmentActivity activity) {
        ViewModelFactory factory = ViewModelFactory.getInstance(activity.getApplication());
        return ViewModelProviders.of(activity, factory).get(ViewModel1.class);
    }

    static public ViewModel2 obtainViewModel2(FragmentActivity activity) {
        ViewModelFactory factory = ViewModelFactory.getInstance(activity.getApplication());
        return ViewModelProviders.of(activity, factory).get(ViewModel2.class);
    }

    @BindingAdapter({"bind:handler"})
    public static void bindViewPagerAdapter(final ViewPager view, final MainActivity activity) {
        Log.d(TAG, "bindViewPagerAdapter");
        final MainSectionFragmentStatePagerAdapter adapter = new MainSectionFragmentStatePagerAdapter(view.getContext(), activity.getSupportFragmentManager());
        view.setAdapter(adapter);
    }
}

Fragment1. java

package com.jone.tablayouttest;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.jone.tablayouttest.databinding.Layout1Binding;
import com.jone.tablayouttest.databinding.Layout1BindingImpl;

public class Fragment1 extends Fragment {
    private static Fragment1 INSTANCE = new Fragment1();

    public static Fragment1 newInstance() {
        return INSTANCE;
    }

    private Layout1Binding mBinding;

    private ViewModel1 mViewModel;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        mBinding = Layout1BindingImpl.inflate(getLayoutInflater(), container, false);

        mViewModel = MainActivity.obtainViewModel1(getActivity());

        mBinding.setViewmodel(mViewModel);

        mBinding.setLifecycleOwner(this);

        return mBinding.getRoot();
    }
}

ViewModel1. java

package com.jone.tablayouttest;

import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.MutableLiveData;
import android.databinding.ObservableBoolean;
import android.databinding.ObservableField;
import android.support.annotation.NonNull;

public class ViewModel1 extends AndroidViewModel {

    public final ObservableBoolean value = new ObservableBoolean();
    public final ObservableField<String> text = new ObservableField<>();

    public ViewModel1(@NonNull Application application) {
        super(application);
        value.set(true);
        text.set("abd");
    }


}

Адаптер:

package com.jone.tablayouttest;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup;

public class MainSectionFragmentStatePagerAdapter extends FragmentStatePagerAdapter {
    Context mCtx;

    public MainSectionFragmentStatePagerAdapter(final Context context, FragmentManager fm) {
        super(fm);
        mCtx = context.getApplicationContext();
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                return Fragment1.newInstance();
            case 1:
                return Fragment2.newInstance();
        }
        return null;
    }

    @Override
    public int getItemPosition(@NonNull Object object) {
        return super.getItemPosition(object);
    }

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

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "1";
            case 1:
                return "2";
        }
        return "";
    }
}

main_activity. xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <data>
        <variable
            name="handler"
            type="com.jone.tablayouttest.MainActivity" />
        <variable
            name="manager"
            type="android.support.v4.app.FragmentManager" />

    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v4.view.ViewPager
            android:id="@+id/vp_content"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:handler="@{handler}"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>
</layout>

layout1. xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="viewmodel"
            type="com.jone.tablayouttest.ViewModel1" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <CheckBox
            android:id="@+id/checkBox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="@{viewmodel.value}"
            android:text="CheckBox1" />
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewmodel.text}" />
    </LinearLayout>
</layout>

Fragment2. java и layou2. xml почти такие же, как здесь. Так что я не вставляю их сюда. Спасибо.

...