gpt4 book ai didi

java - 从外部类到 recyclerView 的 notifyDataSetChanged()

转载 作者:行者123 更新时间:2023-11-30 02:00:12 25 4
gpt4 key购买 nike

我有一个 fragment 类作为我的 mainActivity 类的内部类,我在这里定义了一个 RecyclerView,它附加到一个 SlidingTabLayout。我正在请求一些 JSON 数据,我应该更新这个 RecyclerView。当我在我的 mainActivity 类中的一个函数中解析 JSON 数据后调用 ListingsFragment.mAdapter.notifyDataSetChanged() 没有任何反应:(

在我的 getData() 中,我将数据从对象的 ArrayList 加载到 RecyclerView,我在之前解析 JSON 结果后将数据复制到该数组。

感谢任何帮助或想法。谢谢。

这是我的 fragment 类

     public static class ListingsFragment extends Fragment {

private RecyclerView mListRecyclerView;

private static ListAdapter mAdapter;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {



// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.listings_fragment, container, false);
mListRecyclerView = (RecyclerView) view.findViewById(R.id.listing_recyclerView);

mListRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(getActivity())
.marginResId(R.dimen.leftmargin, R.dimen.rightmargin)
.build());


mAdapter = new ListAdapter(getActivity(), getData());

mListRecyclerView.setAdapter(mAdapter);
mListRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

return view;
}

最佳答案

setAdapter 代替 notifyDataSetChanged 怎么样?

更新:这不仅仅是一种解决方法,据我所知可能是必要的。查看了 RecyclerView

的数据逻辑实现
private class RecyclerViewDataObserver extends AdapterDataObserver {
@Override
public void onChanged() {
assertNotInLayoutOrScroll(null);
if (mAdapter.hasStableIds()) {
// TODO Determine what actually changed.
// This is more important to implement now since this callback will disable all
// animations because we cannot rely on positions.
mState.mStructureChanged = true;
setDataSetChangedAfterLayout();
} else {
mState.mStructureChanged = true;
setDataSetChangedAfterLayout();
}
if (!mAdapterHelper.hasPendingUpdates()) {
requestLayout();
}
}

@Override
public void onItemRangeChanged(int positionStart, int itemCount) {
assertNotInLayoutOrScroll(null);
if (mAdapterHelper.onItemRangeChanged(positionStart, itemCount)) {
triggerUpdateProcessor();
}
}
....

布局变化依赖于AdapterHelperUpdateOp队列,但是不同于onItemRangeInsertedonChanged实际上并没有将任何 UpdateOP 放入队列中,我猜这还没有实现(应该写在 //TODO Determine what actually changed. 并将总更改拆分为原子更新).

个人notifyDataSetChangedsetAdapterswapAdapter 之间确实没有太大的性能差异,几乎应该完成相同数量的 UI 渲染工作(与 onMeasure 相比,在对象实例开销方面感觉自由)。

RecyclerView 更适合卡片式的单一操作,所以最好弄清楚实际发生了什么变化并执行 notifyItemRangeChanged(int, int)

其他一些示例也使用 setAdapter,如下所示: http://javatechig.com/android/android-recyclerview-example

关于java - 从外部类到 recyclerView 的 notifyDataSetChanged(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31601366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com