我有一个片段类作为mainActivity类的内部类,我在这里定义了一个RecyclerView,它附加到SlidingTabLayout。我正在请求一些JSON数据,我应该更新这个RecyclerView。当我在mainActivity类的一个函数中解析JSON数据后调用 ListingsFragment.mAdapter.notifyDataSetChanged()时,没有发生任何事情:(
在我的getData()中,我从早期解析JSON结果后复制数据的对象ArrayList中将数据加载到RecyclerView。
任何帮助或想法表示赞赏。谢谢。
这是我的片段类
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;
}
答案 0 :(得分:1)
再次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();
}
}
....
布局更改取决于AdapterHelper
的{{1}}队列,但与UpdateOp
不同,onItemRangeInserted
实际上没有将任何onChanged
放入队列,我想还没有实现(应该写在UpdateOP
中并将总更改分成原子更新)。
个人,// TODO Determine what actually changed.
和notifyDataSetChanged
或setAdapter
之间的性能差异确实不大,因为应该完成几乎相同数量的UI渲染工作(与onMeasure相比,在对象实例开销方面感到自由)。
swapAdapter
更专为卡式单一操作而设计,因此最好弄清楚实际发生了什么变化并执行RecyclerView
其他一些例子也像这样使用notifyItemRangeChanged(int, int)
:
http://javatechig.com/android/android-recyclerview-example
答案 1 :(得分:0)
您的mAdapter
正在private
。您应该将其更改为public
并在此处对结果进行评论。
你确定你有JSON Object
吗?请提出Log
或Toast
并再次发表评论!
P / s:抱歉我的英文不好