繁体   English   中英

更新 android 中的 RecyclerView 项目

[英]Update RecyclerView items in android

我想使用向 API 和计时器发送请求来更新 RecyclerView 中的项目。

这是我的代码:

@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 秒更新一次,但它从头开始。

我应该怎么做才能在更新期间保持列表的位置?

您不应该在每个 api 调用中创建新的 RecyclerView 对象。 此外,您还在每次调用中使用 RecycletView 分配适配器和 LayoutManager。

您只需要使用 RecycletView setAdapter 一次,然后第二次只需在您的适配器列表中添加新数据并通知您的适配器刷新。

请检查以下代码。

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;
}

我自己没有测试过这段代码。但它必须工作。如果没有,请告诉我。

    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) {
        }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM