首页 > 解决方案 > 在 LiveData 中调用 onChanged 事件时进行编辑

问题描述

我创建了一个简单的应用程序,它在调用 onChanged 事件时写入日志。目前,每次我通过 setValue 增加 MyInteger 时都会调用 onChanged。我想修改一下,只为特定事件调用 onChanged 例如,仅在 MyInteger > 3 时调用 onChanged。我试图覆盖 MyInteger 中的 equals 方法,但它不起作用。我怎样才能做到这一点?

public class MainActivity extends AppCompatActivity {

    private MainActivityViewModel mMainActivityViewModel;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.my_button);
        MyInteger myInteger = new MyInteger(0);

        mMainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
        mMainActivityViewModel.getLiveData2().observe(this, new Observer<MyInteger>() {
            @Override
            public void onChanged(MyInteger myInteger) {
                Log.d("onChanged:", String.valueOf(myInteger.integer));
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myInteger.incrementByOne();
                mMainActivityViewModel.getLiveData2().setValue(myInteger);

            }
        });
    }
}

public class MainActivityViewModel extends AndroidViewModel {

    public MutableLiveData<MyInteger> myIntegerMutableLiveData;

    public MainActivityViewModel(@NonNull Application application) {
        super(application);
    }

    public MutableLiveData<MyInteger> getLiveData2() {

        if (myIntegerMutableLiveData == null) {
            myIntegerMutableLiveData = new MutableLiveData<>();
        }
        return myIntegerMutableLiveData;
    }
}

public class MyInteger {

 MyInteger object.
    public int integer;

    public MyInteger(Integer integer) {
        this.integer = integer;
    }

    public void incrementByOne() {
        integer++;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyInteger myInteger = (MyInteger) o;
        return myInteger.integer > 3;
    }

    @Override
    public int hashCode() {
        return Objects.hash(integer);
    }
}

标签: javaandroidequalsandroid-livedata

解决方案


为什么你不能做

if(myInteger > 3){
    mMainActivityViewModel.getLiveData2().setValue(myInteger);
}

覆盖等号不会做任何事情,当您setValue在 LiveData 中设置值时,即调用 onChanged 时。如果您需要扩展 LiveData 类


推荐阅读