2016-07-27 9 views
3

私は縦に3つの行を持つRecyclerview(親)を持っています。 RecyclerView(child1)、RecyclerView(child2)、RecyclerView(child3)としての各行は、それぞれchild1のようなレイアウトマネージャーの異なるタイプを持ち、gridLayoutマネージャー、child2 &には垂直LinearLayoutマネージャーがあります。Recyclerview内のRecyclerviewはスムーズにスクロールしません

したがって、行ごとに設定すると、各行には異なるタイプのアダプタがあります。しかし、私がrecyclerviewをスクロールしているときに問題が発生します。滑らかなスクロールではなく、目に見える2番目の行に700ミリ秒かかります。

マイrow_list_itemレイアウトは次のとおりです。

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 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"> 

    <LinearLayout 
     android:id="@+id/ll_main_block" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="40dp" 
      android:orientation="horizontal" 
      android:paddingLeft="10dp" 
      android:paddingStart="10dp" 
      android:paddingRight="10dp" 
      android:layout_marginTop="15dp" 
      android:layout_marginBottom="12dp" 
      android:paddingEnd="10dp" 
      android:gravity="center_vertical" 
      android:weightSum="1"> 

      <TextView 
       android:id="@+id/tv_heading" 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:layout_weight="0.8" 
       android:gravity="center_vertical" 
       android:text="" 
       android:textColor="@color/dark_grey" 
       android:textSize="@dimen/midium_text_size" /> 

      <LinearLayout 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:layout_weight="0.2" 
       android:id="@+id/linearLayout_viewall" 
       android:visibility="gone" 
       android:gravity="center_vertical|end" 
       android:orientation="horizontal"> 

       <TextView 
        android:id="@+id/tv_more" 
        android:layout_width="wrap_content" 
        android:layout_height="match_parent" 
        android:drawablePadding="5dp" 
        android:gravity="center_vertical|end" 
        android:text="@string/view_all" 
        android:textSize="@dimen/small_text_size" /> 

       <ImageView 
        android:layout_width="15dp" 
        android:layout_height="15dp" 
        android:contentDescription="@null" 
        android:src="@drawable/next" /> 
      </LinearLayout> 
     </LinearLayout> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/rv_category_outlet" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
    </LinearLayout> 
</FrameLayout> 

私はマルチタイプで、いくつかの主要なアダプターコードを入れています:それは初めてである場合

@Override 
public int getItemCount() { 
    int size = 4; 
    if (isErrorView) { 
     size = 1; 
    } 
    return size; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = null; 

    if (viewType == TYPE_NEARBY 
      || viewType == TYPE_PEOPLE || viewType == TYPE_DEFAULT || viewType == TYPE_SERVICES) { 

     view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.list_item_discover_adapter, parent, false); 
     RecyclerView.ViewHolder timelineViewHolder = new vHolderEverything(view); 
     return timelineViewHolder; 

    } else if (viewType == TYPE_ERROR) { 
     view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.inflator_error_listview, parent, false); 
     vHolderError timelineViewHolder = new vHolderError(view); 
     return timelineViewHolder; 
    } 
    return null; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
    String headingText = ""; 
    boolean isMainBlockInvisible = false; 
    vHolderEverything mVHolder; 
    switch (getItemViewType(position)) { 
     case TYPE_ERROR: 
      break; 
     case 1: 
      mVHolder = (vHolderEverything) holder; 
      try { 
       GridLayoutManager lLayout = new GridLayoutManager(curr_activity, 2); 
       mVHolder.rv_category_outlet.setNestedScrollingEnabled(false); 
       mVHolder.rv_category_outlet.setHasFixedSize(true); 

       int spanCount = 4; // 3 columns 
       int spacing = 4; // 50px 
       boolean includeEdge = false; 

       mVHolder.rv_category_outlet.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing, includeEdge)); 
       mVHolder.rv_category_outlet.setLayoutManager(lLayout); 

       if (dataForDiscovery != null) { 
        try { 

         if (position == TYPE_SERVICES) { 
          headingText = curr_activity.getResources().getString(R.string.popular_Service); 

          mVHolder.adapterObject_services.clear(); 
          mVHolder.adapterObject_services.addAll(dataForDiscovery.getData().getPopularServices()); 
          if (mVHolder.adapterObject_services != null && mVHolder.adapterObject_services.size() > 0) { 
           mVHolder.rv_category_outlet.setAdapter(mVHolder.discoveryPopularListAdapter); 
          } else { 
           isMainBlockInvisible = true; 
          } 
         } else { 
          isMainBlockInvisible = true; 

         } 

        } catch (Exception e) { 
         isMainBlockInvisible = true; 
        } 
       } else { 
        isMainBlockInvisible = true; 
       } 

      } catch (Exception e) { 
       isMainBlockInvisible = true; 
      } 

      if (isMainBlockInvisible) { 
       mVHolder.ll_main_block.setVisibility(View.GONE); 
      } else { 
       ((vHolderEverything) holder).linearLayout_viewall.setVisibility(View.GONE); 
       mVHolder.tv_heading.setText(headingText); 
       mVHolder.tv_more.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Activity_Search.search_initiate_view_pager.setCurrentItem(position); 
        } 
       }); 
      } 
      break; 
     case 2: 

      mVHolder = (vHolderEverything) holder; 
      try { 
       LinearLayoutManager layoutManager = new org.solovyev.android.views.llm.LinearLayoutManager(curr_activity, LinearLayoutManager.VERTICAL, false); 
       mVHolder.rv_category_outlet.setLayoutManager(layoutManager); 
       mVHolder.rv_category_outlet.setHasFixedSize(true); 

       if (dataForDiscovery != null) { 
        try { 
         if (position == TYPE_PEOPLE) { 

          mVHolder.adapterObject.clear(); 
          mVHolder.adapterObject.addAll(dataForDiscovery.getData().getPeople()); 
          headingText = curr_activity.getResources().getString(R.string.follow_people_discover); 
          if (mVHolder.adapterObject != null && mVHolder.adapterObject.size() > 0) { 
           mVHolder.rv_category_outlet.setAdapter(mVHolder.adapter); 
          } else { 
           isMainBlockInvisible = true; 
          } 
         } else { 
          isMainBlockInvisible = true; 

         } 

        } catch (Exception e) { 
         isMainBlockInvisible = true; 
        } 
       } else { 
        isMainBlockInvisible = true; 
       } 

      } catch (Exception e) { 
       isMainBlockInvisible = true; 
      } 

      if (isMainBlockInvisible) { 
       mVHolder.ll_main_block.setVisibility(View.GONE); 
      } else { 
       // if (headingText.equalsIgnoreCase("Services")) { 
       ((vHolderEverything) holder).linearLayout_viewall.setVisibility(View.GONE); 
       // } else { 
       // ((vHolderEverything) holder).linearLayout_viewall.setVisibility(View.VISIBLE); 
       //} 
       mVHolder.tv_heading.setText(headingText); 
       mVHolder.tv_more.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Activity_Search.search_initiate_view_pager.setCurrentItem(position); 
        } 
       }); 
      } 
      break; 
     case TYPE_DEFAULT: 
      mVHolder = (vHolderEverything) holder; 
      mVHolder.ll_main_block.setVisibility(View.GONE); 
      break; 
     default: 
      mVHolder = (vHolderEverything) holder; 
      mVHolder.ll_main_block.setVisibility(View.GONE); 

      break; 
    } 

} 

public static class vHolderEverything extends RecyclerView.ViewHolder { 
    TextView tv_heading; 
    TextView tv_more; 
    RecyclerView rv_category_outlet; 
    LinearLayout ll_main_block, linearLayout_viewall; 
    ArrayList<ReusableServices> adapterObject_services= new ArrayList<ReusableServices>(); 
    DiscoveryPopularListAdapter discoveryPopularListAdapter = null; 
    RecyclerView.Adapter adapter = null; 
    ArrayList<FollowPeopleSuggestionData> adapterObject= new ArrayList<FollowPeopleSuggestionData>(); 

    public vHolderEverything(View itemView) { 
     super(itemView); 

     this.tv_heading = (TextView) itemView.findViewById(R.id.tv_heading); 
     this.tv_more = (TextView) itemView.findViewById(R.id.tv_more); 
     this.rv_category_outlet = (RecyclerView) itemView.findViewById(R.id.rv_category_outlet); 
     this.ll_main_block = (LinearLayout) itemView.findViewById(R.id.ll_main_block); 
     this.linearLayout_viewall = (LinearLayout) itemView.findViewById(R.id.linearLayout_viewall); 
     MazkaraApp.getInstance().applyTypefaceItalic(tv_more); 
     MazkaraApp.getInstance().applyTypefaceBlack(tv_heading); 


     try { 
      if (adapterObject_services != null) 
       discoveryPopularListAdapter = new DiscoveryPopularListAdapter(curr_activity, adapterObject_services); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     try { 
      if (adapterObject != null) 
       adapter = new AdapterRecycler_Search_Users(curr_activity, curr_activity, adapterObject); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

これはのみ発生します。 2回目は正常に動作するはずです。

答えて

0

それぞれの子ビューアダプターを関連するrecyclerViewに設定している間は、ネストされたスクロールをfalseに設定してください。ここに抜粋があります:

{ 
childRecyclerView1.setAdapter(childAdapter1); 
childRecyclerView1.setNestedScrollingEnabled(false); 
} 

スクロールがスムーズになります。

0

@Anant私は同じ要件を満たしており、以下のトリックが働いていました。親のrecyclerviewをNestedScrollViewの中に入れ、あなたのonCreateメソッドにセットします。

mRecyclerView.setHasFixedSize(true); 
mRecyclerView.setNestedScrollingEnabled(false); 

これは、親リサイクルビューのスクロールを防止し、スクロールが完全にスムーズになります。

関連する問題