Android 当每个项目中有一个字段被内容更新时,设置更新过程的最佳方法是什么

Android 当每个项目中有一个字段被内容更新时,设置更新过程的最佳方法是什么,android,android-recyclerview,android-livedata,Android,Android Recyclerview,Android Livedata,我想做的是创建一个烹饪警报应用程序 我正在使用MVVM体系结构,并希望通过LiveData对其进行更新 这是我的闹钟课。 每隔一秒钟,数据中的所有项都将被触摸,并且应调用勾号勾选将更新timeLeft,它应反映在UI上。但是,屏幕的其他组件应保持不变 唯一定期更新的是表示剩余时间的文本(我还没有编写代码将其从int转换为string)。 确保“回收者”视图只更新时间而不浪费时间重新设置图像和项目名称的最佳方法是什么 class Alarm(item: Item, private val cont

我想做的是创建一个烹饪警报应用程序

我正在使用MVVM体系结构,并希望通过LiveData对其进行更新

这是我的闹钟课。 每隔一秒钟,
数据
中的所有
都将被触摸,并且应调用
勾号
<代码>勾选将更新
timeLeft
,它应反映在UI上。但是,屏幕的其他组件应保持不变

唯一定期更新的是表示剩余时间的文本(我还没有编写代码将其从int转换为string)。 确保“回收者”视图只更新时间而不浪费时间重新设置图像和项目名称的最佳方法是什么

class Alarm(item: Item, private val context: Context, val notifyID: Int) {

    var timeLeft = item.timeInSec
    val name = item.name
    val imageUri = item.imageUri

    var isFinished = false

    // count down goes down every seconds
    fun tick() {
        timeLeft--
        if (timeLeft <= 0) {
            onFinish()
        }
    }

    fun onFinish() {
        isFinished = true
    }

} 
类报警(项:项,专用val上下文:上下文,val notifyID:Int){
var timeLeft=item.timeinse
val name=item.name
val imageUri=item.imageUri
var isFinished=false
//倒计时每秒钟一次
趣味勾号(){
时间限制--

if(timeLeft这里是一个使用LiveData、RecyclerView和ViewModel的实现

活动:

    private MyVM mVM;
    private RecyclerView mRecyclerView;
    private Adapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...

        mRecyclerView = findViewById(...);
        mVM = ViewModelProviders.of(this).get(MyVM.class);
        mAdapter = new Adapter(mVM.getStuff().getValue(), getLayoutInflater());
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mVM.getStuff().observe(this, stuff -> {
            mAdapter.setItems(stuff);
        });
    }

    static class Adapter extends RecyclerView.Adapter<Adapter.VH> {

        private // list items ;
        private LayoutInflater mInflater;

        Adapter(..., LayoutInflater i) {
            ...
            mInflater = i;
        }

        @NonNull
        @Override
        public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return new VH(mInflater.inflate(R.layout.item, parent, false));
        }

        @Override
        public void onBindViewHolder(@NonNull VH holder, int position) {
            //set views in holder
        }

        @Override
        public int getItemCount() {
            //return size of the collection
        }

        public void setItems(...) {
            // update with diffutil
            notifyDataSetChanged();
        }

        static class VH extends RecyclerView.ViewHolder{
            // views

            VH(View v){
                super(v);
                ...
            }
        }
    }

private-MyVM-mVM;
私人回收视图mRecyclerView;
专用适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
...
mRecyclerView=findViewById(…);
mVM=ViewModelProviders.of(this.get)(MyVM.class);
mAdapter=newadapter(mVM.getStuff().getValue(),getLayoutInflater());
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(新的LinearLayoutManager(this));
mVM.getStuff().observe(this,stuff->{
mAdapter.setItems(stuff);
});
}
静态类适配器扩展了RecyclerView.Adapter{
私有//列表项;
私人停车场;
适配器(…,平面布置器i){
...
mInflater=i;
}
@非空
@凌驾
公共VH onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
返回新VH(最小充气机充气(R.layout.item,父项,false));
}
@凌驾
BindViewHolder上的公共无效(@非空VH holder,内部位置){
//在支架中设置视图
}
@凌驾
public int getItemCount(){
//返回集合的大小
}
公共无效集合项(…){
//使用diffutil更新
notifyDataSetChanged();
}
静态级VH扩展了RecyclerView.ViewHolder{
//观点
VH(视图v){
超级(五);
...
}
}
}
视图模型:

public class MyVM extends ViewModel {
    private MutableLiveData<...> stuff;

    public MyVM(){
        // initialize and mutate stuff
    }

    public LiveData<...> getStuff(){
        return getStuff;
    }
}
公共类MyVM扩展了ViewModel{
私有可变livedata文件;
公共MyVM(){
//初始化和变异东西
}
公共LiveData getStuff(){
退货;
}
}

所以UI更新代码应该在我的片段中,这是由订阅我的ViewModel触发的?好的,谢谢,我尝试这种方法,看看它是否会打破一个问题,我应该有两个数据副本吗?一个在适配器中,另一个在ViewModel中?或者它们应该只引用相同的东西吗?使用diffutil更新e有效地保存项目。