【问题标题】:nested RecyclerView with SortedList shows nothing带有 SortedList 的嵌套 RecyclerView 什么也不显示
【发布时间】:2016-08-17 16:05:13
【问题描述】:

我有一个 RecyclerView 嵌套在 NestedScrollView 中,适配器使用 SortedList 来保存内容。

这是我的布局:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.NestedScrollView
        marginTop="@{StatusbarUtils.getTopMargin(context)}"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

            <!-- some more ui elements -->

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_settings_cameras"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

            <!-- some more ui elements -->

    </android.support.v4.widget.NestedScrollView>

</FrameLayout>

还有我的适配器:

public class SettingsRecyclerViewAdapter extends RecyclerView.Adapter<SettingsRecyclerViewAdapter.ViewHolder> {

    @NonNull private final SortedList<Camera> cameras;

    public SettingsRecyclerViewAdapter(@NonNull final OnSettingsInteractionListener listener) {
        cameras = new SortedList<>(Camera.class, new CameraSortedListCallback(this));
    }

    public void addCamera(@NonNull final Camera camera) {
        cameras.add(camera);
    }

    private static class CameraSortedListCallback extends SortedListAdapterCallback<Camera> {

        private final RecyclerView.Adapter adapter;

        CameraSortedListCallback(final RecyclerView.Adapter adapter) {
            super(adapter);
            this.adapter = adapter;
        }

        @Override
        public int compare(final Camera o1, final Camera o2) {
            return 0;
        }

        @Override
        public boolean areContentsTheSame(final Camera oldItem, final Camera newItem) {
            return false;
        }

        @Override
        public boolean areItemsTheSame(final Camera item1, final Camera item2) {
            return false;
        }
    }
}

以及我如何使用它:

    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    linearLayoutManager.setAutoMeasureEnabled(true);

    adapter = new SettingsRecyclerViewAdapter(this);

    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setHasFixedSize(true);
    recyclerView.setNestedScrollingEnabled(false);
    recyclerView.setAdapter(adapter);

当我使用它并调用 addCamera(...) 时,什么也没有发生 :-(

SortedListAdapterCallback 有一个调用mAdapter.notifyItemRangeInserted(position, count)onInserted 方法。当我覆盖它并添加 adapter.notifyDataSetChanged() 时,RecyclerView 会显示这些项目。

    @Override
    public void onInserted(int position, int count) {
        Timber.i("onInserted() called with: " + "position = " + position + ", count = " + count);
        adapter.notifyDataSetChanged();
        super.onInserted(position, count);
    }

这是一个错误还是我做错了什么?

【问题讨论】:

    标签: android android-recyclerview sortedlist


    【解决方案1】:

    您需要删除 setHasFixedSize(true) 调用(默认为 false)。如果这是真的,recyclerview 认为它的大小在你通知他时不会改变,但这里不是这种情况;)

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2017-03-20
      • 2020-10-28
      • 2010-09-15
      相关资源
      最近更新 更多