Как сохранить onClickListener после того, как все элементы изменены? Или Как я могу установить onClickListener для всех элементов в RecyclerView с обновлением потока? - PullRequest
0 голосов
/ 08 июля 2019

Я хочу сделать recyclerView, который может отображать изменяемые в реальном времени элементы данных с помощью onClickListener.

Вот мой код: (пользовательский адаптер для RecyclerView)

    public MyRecyclerAdapter(ArrayList<Procedure> procs){
        this.procedures = procs;


        final Handler handler = new Handler(){
            public void handleMessage(Message msg){
                updateList();
            }
        };

        Timer timer = new Timer(true);
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                Message msg = handler.obtainMessage();
                handler.sendMessage(msg);
            }

            @Override
            public boolean cancel() {
                return super.cancel();
            }
        };
        timer.schedule(timerTask, 0, 1);
    }
...
    public void updateList(){
        if(procedures != null && procedures.size()>0){
            notifyDataSetChanged();
        }
    }

updateList () обновляет элементы представления пользовательского интерфейса каждые 1 мс. Это хорошо работает, но onClickListener, который я добавил в myRecyclerAdapter, не работает ...

После нескольких тестов, я думаю, что вызов notifyDataSetChanged () заменяет оригинальный onClickListener на новый ... потому что обычное время касания экрана больше 1 мс, поэтому оригинальный onClick () исчезает, когда я касаюсь экрана.

Как правильно добавить onClickListener к каждому элементу RecyclerView, который обновляется каждые 1 мс (в режиме реального времени)?

Установка времени обновления Период 300 мсек ~ 500 мс лучше, но я хочу видеть более быстрое обновление, поэтому помогите мне ... Я не могу найти решение нигде.

//import things...

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder>{
    public ArrayList<Procedure> procedures;
    public Context mContext;

    public MyRecyclerAdapter(ArrayList<Procedure> procs){
        this.procedures = procs;


        final Handler handler = new Handler(){
            public void handleMessage(Message msg){
                updateList();
            }
        };

        Timer timer = new Timer(true);
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                Message msg = handler.obtainMessage();
                handler.sendMessage(msg);
            }

            @Override
            public boolean cancel() {
                return super.cancel();
            }
        };
        timer.schedule(timerTask, 0, 300);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType){
        //skipped
    }


    @Override
    public void onBindViewHolder(final ViewHolder holder, int pos){
        //UI Changes (Which is actually updated)
    }

    public void updateList(){
        if(procedures != null && procedures.size()>0){
            notifyDataSetChanged();
        }
    }

    @Override
    public int getItemCount(){
        return procedures.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        //Elements...
        public ViewHolder(View view){
            super(view);
            //Settings UI elements
            deleteButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //This listener has to be maintained even after data changed
                    Toast.makeText(mContext, "alert", Toast.LENGTH_LONG).show();
                }
            });
        }
    }
}

...