1

我有一个嵌套在NestedScrollView中的RecyclerView,并且适配器使用SortedList来保存内容。与SortedList嵌套的RecyclerView不显示

这是我的布局:

<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有一个onInserted方法,它调用mAdapter.notifyItemRangeInserted(position, count)。当我覆盖它并添加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); 
    } 

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

回答

1

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

希望这可以帮助