Обновление элементов RecyclerView в Android - PullRequest
0 голосов
/ 27 апреля 2019

Я хочу обновить элементы внутри RecyclerView, используя отправку запроса в API и таймер.

Это мой код:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    get_items();

    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        synchronized public void run() {
            get_items();
        }
    }, TimeUnit.SECONDS.toMillis(3), TimeUnit.SECONDS.toMillis(3));

}

public void get_items(){
    Client client = ServiceGenerator.createService(Client.class,getBaseContext());
    final Call<List<Items>> call = Client.getItems("items");
    call.enqueue(new Callback<List<Items>>() {
        @Override
        public void onResponse(Call<List<Items>> call, Response<List<Items>> response) {
            List<Items> items = response.body();
            ItemsAdapter adapter = new ItemsAdapter(items);
            recyclerView = findViewById(R.id.chatrecycler);
            recyclerView.setAdapter(adapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(Activity.this, LinearLayoutManager.VERTICAL,true));
        }
        @Override
        public void onFailure(Call<List<Items>> call, Throwable t) {
        }
    });
}

И каждые 3 секунды список обновляется, но начинается с начала.

Что мне делать, чтобы сохранить позицию списка во время обновления ??

Ответы [ 3 ]

0 голосов
/ 27 апреля 2019

Не следует создавать новый объект RecyclerView при каждом вызове API.Также вы назначаете адаптер и LayoutManager с вашим RecycletView в каждом вызове.

Вам просто нужно установить Adapter с вашим RecycletView один раз, а затем второй раз просто добавить новые данные в список ваших адаптеров и уведомить свой адаптер об обновлении.

Пожалуйста, проверьте ниже код.

private ItemsAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    recyclerView = findViewById(R.id.chatrecycler);
    recyclerView.setLayoutManager(new LinearLayoutManager(SingleChat.this, LinearLayoutManager.VERTICAL,true));

    get_items();

    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        synchronized public void run() {
            get_items();
        }
    }, TimeUnit.SECONDS.toMillis(3), TimeUnit.SECONDS.toMillis(3));
}

public void get_items(){
    Client client = ServiceGenerator.createService(Client.class,getBaseContext());
    final Call<List<Items>> call = Client.getItems("items");
    call.enqueue(new Callback<List<Items>>() {
        @Override
        public void onResponse(Call<List<Items>> call, Response<List<Items>> response) {
            List<Items> items = response.body();

            if(adapter == null) {
                adapter = new ItemsAdapter(items);
                recyclerView.setAdapter(adapter);
            } else {
                runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       adapter.addMoreItems(items);
                       adapter.notifyDatasetChanged();
                   }
              });
            }
        }
        @Override
        public void onFailure(Call<List<SingleChatItem>> call, Throwable t) {
        }
    });
}

Добавьте один метод в вашем ItemsAdapter.java как,

public void addMoreItems(List<Items> items) {
    this.items = items;
}
0 голосов
/ 27 апреля 2019

Я сам не проверял этот код. Но он должен работать. Дайте мне знать, если он не работает.

    final ItemsAdapter adapter = null;
    ArrayList<Items> items = null;
    recyclerView = findViewById(R.id.chatrecycler);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(Activity.this, LinearLayoutManager.VERTICAL,true));
    call.enqueue(new Callback<List<Items>>() {
        @Override
        public void onResponse(Call<List<Items>> call, Response<List<Items>> response) {
            List<Items> newItems = response.body();
            if(adapter == null){
                adapter = new ItemsAdapter(items);
                items.addAll(newItems);
            }else{
                int i = 0;
                for(Item item : items){
                    int index = newItems.indexOf(item);
                    item.stuff = newItems.get(index).stuff;
                    adapter.notifyItemChanged(i);
                    i++;
                }
            }
        }
        @Override
        public void onFailure(Call<List<Items>> call, Throwable t) {
        }
    });
0 голосов
/ 27 апреля 2019

получить позицию RecyclerView до обновления Затем обновите свой вид переработчика вместо воссоздания Замените ваш onResponse, как показано ниже

List<Items> items = response.body();

// adapter is a public field

if(mAdapter==null)
{
    mAdapter = new ItemsAdapter(items);
                recyclerView = findViewById(R.id.chatrecycler);
                recyclerView.setAdapter(mAdapter);
                recyclerView.setLayoutManager(new LinearLayoutManager(SingleChat.this, LinearLayoutManager.VERTICAL,true));
}else{
    int pisition=mAdapter.getAdapterPosition();
    recyclerview.notifyDatasetChanged();
    recyclerView.scrolltoPosition(position);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...