使用NestedScrollView中的Multiple Recyclerview不会发生回收

时间:2016-07-18 07:22:44

标签: java android android-fragments android-recyclerview android-nestedscrollview

我遇到了在Recyclerview内管理多个NestedScrollView回收的问题。让我告诉我我想做什么 -

  1. 我有两种帧布局,即frame1和frame2。
  2. 我有两个包含recyclerview的片段,第一个片段的recyclelerview水平显示项目,而第二个片段的recyclelerview显示垂直列表。
  3. 现在我已将FrameLayout放在NestedScroolView内,frame1 recyclerview正在回收所有视图,但是frame2 recylerview不回收视图,不知道为什么?首先加载所有项目,然后在屏幕上显示。
  4. 一些代码:

    MainActivity.java

     FragmentTransaction transaction;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    FragmentA frag1=new FragmentA();
    FragmentB frag2=new FragmentB();
    transaction =    getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.frame1, frag1);
        transaction.addToBackStack(frag1.getClass().getName());
        transaction.commit();
    
     transaction =   getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.frame2, frag2);
        transaction.addToBackStack(frag2.getClass().getName());
        transaction.commit();
    }
    

    main.xml中

      <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
     <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
      <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
            <FrameLayout
                android:id="@+id/frame1"
                android:layout_width="match_parent"
                android:layout_height="185dp" />
    
            <FrameLayout
                android:id="@+id/frame2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                 />
    
    </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
        </LinearLayout>
    

    FragmentA:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
        View v= inflater.inflate(R.layout.recycler_view, container, false);
        mDataListView = (RecyclerView) v.findViewById(R.id.data_list_view);
        mDataListView .setHasFixedSize(true);
        final GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), getActivity().getResources().getInteger(R.integer.playlist_categories_columns), GridLayoutManager.VERTICAL, false);
    
        mDataListView .setNestedScrollingEnabled(false);
       }
        }));
    
    
        return v;
    }
    

    FragmentB:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
        View v= inflater.inflate(R.layout.recycler_view, container, false);
        mDataListView = (RecyclerView) v.findViewById(R.id.data_list_view);
        mDataListView .setHasFixedSize(true);
         final GridLayoutManager gridLayoutManager = new    GridLayoutManager(getActivity(), 1, GridLayoutManager.HORIZONTAL, false);
        mDataListView .setLayoutManager(gridLayoutManager);
    
        mDataListView .setNestedScrollingEnabled(false);
       }
        }));
    
    
        return v;
    }
    

    recycler_view.xml

     <?xml version="1.0" encoding="utf-8"?>
     <android.support.v7.widget.RecyclerView    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/data_list_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    

    我希望我对自己的问题很清楚。

1 个答案:

答案 0 :(得分:0)

根据我的经验,我发现recyclerview's内的多个NestedScrollView无法进行视图回收。

但是我想出了根据我的要求显示多个Recyclerview的解决方案我想在顶部显示一个Horizo​​ntal Recyclerview,在它下面显示一个Vertical Recyclerview,这样我所做的就是它可以帮助某人。

我删除了NestedScrollView作为Recyclerview's的父级,并将水平Recyclerview设为HeaderView的垂直Recyclerview

代码:

public class ListHeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
ArrayList<String> data;

public ListHeaderAdapter (ArrayList<String> data) {
    this.data = data;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == TYPE_ITEM) {
        //inflate your layout and pass it to view holder
        return new VHItem(null);
    } else if (viewType == TYPE_HEADER) {
        //inflate your layout and pass it to view holder
        return new VHHeader(null);
    }
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
 int pos = position - 1; // for handling of Header view(use pos to fetch data from list)

    if (holder instanceof VHItem) {
        String dataItem = data.get(pos);
        //cast holder to VHItem and set data
    } else if (holder instanceof VHHeader) {
        //cast holder to VHHeader and set data for header.
    }
}

@Override
public int getItemCount() {
    return data.size()+ 1; // for handling of Header view
}

@Override
public int getItemViewType(int position) {
    if (isHeader(position))
        return TYPE_HEADER;

    return TYPE_ITEM;
}

public boolean isHeader(int position) {
    return position == 0;
}


class VHItem extends RecyclerView.ViewHolder {
    TextView title;

    public VHItem(View itemView) {
        super(itemView);
    }
}

class VHHeader extends RecyclerView.ViewHolder {
    Button button;

    public VHHeader(View itemView) {
        super(itemView);
    }
}
}

注意:可以实现相同的逻辑以在任何位置显示水平RecyclerView's

相关问题