[android]从外部的类到 recyclerView notifyDataSetChanged()

标签: json Java Android
发布时间: 2017/3/19 14:20:08
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有 fragment 类作为对我的 mainActivity 内部类类和我已经定义的 RecyclerView,这连接到我要求一些 JSON 数据和我应该更新这 RecyclerView.当我调用ListingsFragment.mAdapter.notifyDataSetChanged()后解析 JSON 数据中什么也没有发生:(我 mainActivity 类中的函数之一 SlidingTabLayout。

在我 getdata () 我从加载数据到 RecyclerView 对象 ArrayList,早些时候解析 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;
        }

解决方法 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();
    }
}
....

Layout更改取决于 AdapterHelperUpdateOp 队列,但不像 onItemRangeInsertedonChanged 实际上并没有发生任何 UpdateOP 入队列,我猜尚未实现 (应写在 // TODO Determine what actually changed. 和分裂原子更新总的更改)。

个人,实在不太多性能差异 notifyDataSetChangedsetAdapterswapAdapter ,几乎相同数量的 UI 呈现工作应该这样做 (只是感觉自由在对象实例开销相比,onMeasure)。

RecyclerView更多设计为卡式单人操作,所以它是更好的图出什么实际更改和执行这样notifyItemRangeChanged(int, int)

其他一些例子也使用 setAdapter 喜欢这个︰ http://javatechig.com/android/android-recyclerview-example

赞助商