notifyDataSetChanged()从外部类到recyclerView

时间:2015-07-24 02:45:41

标签: java android json

我有一个片段类作为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;
        }

2 个答案:

答案 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.notifyDataSetChangedsetAdapter之间的性能差异确实不大,因为应该完成几乎相同数量的UI渲染工作(与onMeasure相比,在对象实例开销方面感到自由)。

swapAdapter更专为卡式单一操作而设计,因此最好弄清楚实际发生了什么变化并执行RecyclerView

其他一些例子也像这样使用notifyItemRangeChanged(int, int)http://javatechig.com/android/android-recyclerview-example

答案 1 :(得分:0)

您的mAdapter正在private。您应该将其更改为public并在此处对结果进行评论。

你确定你有JSON Object吗?请提出LogToast并再次发表评论!

P / s:抱歉我的英文不好