Каков наилучший способ настроить процесс обновления, когда в каждом элементе имеется одно поле - PullRequest
0 голосов
/ 10 октября 2019

Что я хочу сделать, так это создать приложение Cooking Alarm.

Я использую архитектуру MVVM и хочу обновить ее через LiveData.

Это класс тревогиУ меня есть. каждую секунду будут затронуты все item внутри data и должен быть вызван tick. tick обновит timeLeft, что должно быть отражено в пользовательском интерфейсе. Тем не менее, другие компоненты экрана должны оставаться такими же.

Единственное, что регулярно обновляется, это текст, который будет представлять оставшееся время (который мне еще предстоит написать код для преобразования из int в строку). Какой лучший способ убедиться, что представление переработчика только обновляет время и не тратит время на настройку образа и имени элемента заново?

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
    }

} 

1 Ответ

0 голосов
/ 10 октября 2019

Вот реализация, использующая 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);
                ...
            }
        }
    }

ViewModel:

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

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

    public LiveData<...> getStuff(){
        return getStuff;
    }
}
...