【问题标题】:RecyclerView not updating correctlyRecyclerView 没有正确更新
【发布时间】:2015-04-21 22:13:36
【问题描述】:

我是否正确使用了 RecyclerView?每当我更新数据时,尽管已经修改了数据集并调用了相关的 notify 方法,但视图仍然显示旧数据的时刻。最重要的是,我没有看到任何动画,所以我一定是做错了什么。

这里是相关的sn-p代码:

private void refreshData() {
    Utils.hideSoftKeyboard(this);
    if (!Utils.isOnline(getApplicationContext())) {
        Toast.makeText(getApplicationContext(), R.string.toast_no_conn, Toast.LENGTH_SHORT).show();
        return;
    }
    String stopNumber = mStopEdit.getText().toString();
    if (stopNumber.isEmpty()) {
        Toast.makeText(getApplicationContext(), R.string.toast_no_stop, Toast.LENGTH_SHORT).show();
        return;
    }
    mResultNoStop.setVisibility(View.GONE);
    mResults.setVisibility(View.GONE);
    mProgressCircle.setVisibility(View.VISIBLE);
    if (!mDataset.isEmpty()) {
        int size = mDataset.size();
        mDataset.clear();
        mAdapter.notifyItemRangeRemoved(0, size);
    }
    FiveT.getStopData(stopNumber, mRequestQueue, new FiveT.StopDataClientListener() {
        @Override
        public void onResponse(ApiResult result) {
            mProgressCircle.setVisibility(View.GONE);
            if (result.getStopResults().size() == 0) {
                mResultNoStop.setVisibility(View.VISIBLE);
                Toast.makeText(getApplicationContext(), R.string.toast_no_data, Toast.LENGTH_SHORT).show();
                return;
            }
            int i = 0;
            mStopName.setText(result.getStopName());
            for (StopResult res : result.getStopResults()) {
                mDataset.add(res);
                mAdapter.notifyItemInserted(i++);
            }
            mResults.setVisibility(View.VISIBLE);
        }
    });
}

编辑:我像这样初始化RecyclerView:

mDataset = new ArrayList<StopResult>();
mRecyclerView = (RecyclerView) findViewById(R.id.results_recycler_view);
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new RecyclerViewAdapter(mDataset, getApplicationContext());
mRecyclerView.setAdapter(mAdapter);

【问题讨论】:

  • 也许是个愚蠢的问题,但您是否在适配器类中完成了 mDataset 的绑定?
  • @urudroid 是的,我只在适配器的onBindViewHolder 方法中修改视图的布局(并且只通过视图持有者)。
  • 你能提供你的recyclerview的初始化吗?确保你设置了item animator
  • @urudroid 啊,我忘了。我没有设置任何动画师。我编辑了这篇文章。现在我会查一下。
  • 您可以参考this

标签: android material-design android-recyclerview


【解决方案1】:

基于问题的 cmets:

在 RecyclerView 的初始化中,您缺少的是项目动画师的集合。

根据你的代码:

mDataset = new ArrayList<StopResult>();

mRecyclerView = (RecyclerView) findViewById(R.id.results_recycler_view);
mRecyclerView.setItemAnimator(new MyItemAnimator());

mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);

mAdapter = new RecyclerViewAdapter(mDataset, getApplicationContext());
mRecyclerView.setAdapter(mAdapter);

您可以参考this 库以找到最适合您需求的动画。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多