Привязка данных не обновляет TextView при использовании notifyPropertyChanged (BR.xx) - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть рабочая привязка данных для функций, вызываемых из XML (т. Е. "@ {User.mUCL}").Но когда я использую notifyPropertyChanged (BR.mUCL) в любом методе или в любом месте. Новые значения не обновляются, я предоставил ниже примерную проблему, где цикл for обновил Text1 со значениями, но другой Text2 не может обновиться с теми же значениями "не".

JavaFragment

   public class FragmentTwo extends Fragment {

    Update_observable updateObservable;
    TextView fragment_quote_open_val;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        Fragment2Binding fragmentTwoBinding = DataBindingUtil.inflate(inflater,R.layout.fragment2,null,false);
        View view = fragmentTwoBinding.getRoot();
        updateObservable = new Update_observable();
        fragmentTwoBinding.setUser(updateObservable);

        fragment_quote_open_val=(TextView)view.findViewById(R.id.fragment_quote_open_val);

        bindingLoop();

        return view;
    }

    @BindingAdapter({"mUCL"})
    public static void runMe(TextView view, String message) {
        if (message != null)
            view.setText(message);
    }


    public void bindingLoop(){

        final int[] k = {0};

        final Update_observable ss=new Update_observable();

        final Handler handler = new Handler();
        final int delay = 3000; //milliseconds

        handler.postDelayed(new Runnable(){
            public void run(){
                //do something
                k[0]++;
                fragment_quote_open_val.setText(String.valueOf(k[0]));
                ss.setmUCL(String.valueOf(k[0]));

                handler.postDelayed(this, delay);
            }
        }, delay);
    }
}

BaseObservable

 public class Update_observable extends BaseObservable {

    public String mUCL= "not-worked";

    @Bindable
    public String getmUCL() {
        return this.mUCL;
    }

    public void setmUCL(String mUCL) {
        this.mUCL = mUCL;
        notifyPropertyChanged(BR.mUCL);
    }

}

XML

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

<data>

    <variable
        name="user"
        type="com.journaldev.androidmvvmbasics.fragments.Update_observable"/>

</data>


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00ff04"
    android:orientation="vertical"
    android:gravity="center"
    tools:context="com.journaldev.androidmvvmbasics.fragments.FragmentTwo">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:id="@+id/fragment_quote_open_val"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:textColor="#000000"
        android:textSize="16dp" />
    <TextView
        android:id="@+id/fragment_quote_ucl_val"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{user.mUCL}"
        android:layout_margin="20dp"
        bind:mUCL="@{user.mUCL}"
        android:textColor="#000000"
        android:textSize="16dp" />
</LinearLayout>

</layout>

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

пожалуйста, убедитесь, что вы делаете DataBindingUtil.inflate в базовом классе.

Fragment1Binding fragmentOneBinding = DataBindingUtil.inflate(inflater,R.layout.fragment1,null,false);
 View view = fragmentOneBinding.getRoot();
 fragmentOneBinding.setUsermodel(new UserModel("XXXX","XXXX"));

или

 ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, 
 R.layout.activity_main);
  activityMainBinding.setUser(new User());
  activityMainBinding.executePendingBindings();

, затем в BaseObservable class do

@Bindable
    public String mEmail= "....";

перестройте проект, просто чтобы убедиться, что @Bindable точно выполнено

сейчас звоните, согласно вашему требованию.

    notifyPropertyChanged(BR.xxx);
0 голосов
/ 12 декабря 2018

Мне удалось найти ответ на этот вопрос, поскольку привязка данных не может быть выполнена программно.

public class Update_observable extends BaseObservable {

public String mUCL= "worked";

public Update_observable(String mUCL){
    this.mUCL=mUCL;
}

Фрагмент

 public void bindingLoop(){

        final int[] k = {0};


        final Handler handler = new Handler();
        final int delay = 3000; //milliseconds

        handler.postDelayed(new Runnable(){
            public void run(){
                //do something
                k[0]++;
                fragment_quote_open_val.setText(String.valueOf(k[0]));
                updateObservable = new Update_observable(String.valueOf(k[0]));
                fragmentTwoBinding.setUser(updateObservable);
                handler.postDelayed(this, delay);
            }
        }, delay);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...