2015-08-27 31 views
7

Tôi đang sử dụng bố cục trong đó tôi đã sử dụng nhiều RecyclerViews (Ngang) làm chế độ xem mục của RecyclerView. Vấn đề là các cuộn dọc không phải là mịn như tôi đang mong đợi.There là một số jerks trong khi di chuyển theo chiều dọc (Parent RecyclerView).Horizontal RecyclerViews bên trong các thanh cuộn cuộn RecyclerView dọc

Làm cách nào để xóa các trình cuộn cuộn dọc này? Tôi đã sử dụng để thiết lập bộ điều hợp cho RecyclerViews nằm ngang trong phương thức OnBindViewHolder() của Parent RecyclerView.

+0

@JqueryNinja Câu hỏi không phải là về cách thực hiện điều đó. Đó là cách tôi đã làm nó ban đầu. Trên thực tế tất cả mọi người đến đây trong bài đăng này đã làm điều này giống như trong bài viết bạn chia sẻ. Tất cả chúng ta muốn giải pháp cho các jerks cuộn trong việc thực hiện này. Kiểm tra câu trả lời được chấp nhận, trong đó có cải thiện hơn những jerks cuộn. –

Trả lời

12

Tôi đã giải quyết được vấn đề. Hiệu suất ghi lại tốt hơn nhiều trong trường hợp này. Không đặt bộ điều hợp cho RecyclerViews nằm ngang trong phương thức OnBindViewHolder() của Parent RecyclerView. Thay vì nó đặt nó ở lần đầu tiên khi khung nhìn được tạo ra thông qua onCreateViewHolder() của RecyclerView với rỗng hoặc null dataList. Chỉ cần thay thế danh sách dữ liệu trung gian bằng danh sách rỗng trước đó tại onBindViewHolder() và gọi hàm notifydataSetChanged() thành HorizontalAdapetr. Điều này tốt hơn nhiều so với setAdapter() trong onBindViewHolder().

+7

Đoạn mã hoặc gist sẽ thực sự hữu ích. –

3

Bạn có thể thử cách này

hoạt động chính

public void initialize(List<List<ResponseObject>> responseObjectList) { 
    RecyclerView upperRecyclerView = (RecyclerView) this.findViewById(R.id.main_layout); 
    upperRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); 
    VerticalAdapter adapter = new VerticalAdapter(this, responseObjectLists); 
    upperRecyclerView.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
} 

Dọc tái chế xem bộ chuyển đổi

public class VerticalAdapter extends RecyclerView.Adapter<VerticalAdapter.Holder> { 

    final private SearchActivity activity; 
    List<List<ResponseObject>> list; 

    public VerticalAdapter(SearchActivity activity, List<List<ResponseObject>> lists) { 
     this.list = lists; 
     this.activity = activity; 
    } 

    public Holder onCreateViewHolder(ViewGroup parent,int viewType) { 
     View itemLayoutView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.vertical_layout, null); 
     return new Holder(itemLayoutView); 
    } 

    public void onBindViewHolder(Holder viewHolder, int position) { 
     List<ResponseObject> objectList = list.get(position); 
     viewHolder.packageTitle.setText(objectList.get(0).getTag()); 
     ImageAdapter imageAdapter = new ImageAdapter(activity, objectList); 
     viewHolder.horizontalRecyclerView.setLayoutManager(new LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)); 
     viewHolder.horizontalRecyclerView.setAdapter(imageAdapter); 
     viewHolder.horizontalRecyclerView.setNestedScrollingEnabled(false); 
     imageAdapter.notifyDataSetChanged(); 
    } 

    public final static class Holder extends RecyclerView.ViewHolder { 

     protected TextView packageTitle; 
     protected RecyclerView horizontalRecyclerView; 

     public Holder(View view) { 
      super(view); 
      this.packageTitle = (TextView) view.findViewById(R.id.recycleViewTitle); 
      this.horizontalRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
      this.horizontalRecyclerView.setLayoutManager(new LinearLayoutManager(this.horizontalRecyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false)); 
      this.horizontalRecyclerView.setNestedScrollingEnabled(false); 
      horizontalRecyclerView.setAdapter(null); 
     } 
    } 

    public int getItemCount() { 
     return ListUtil.isEmpty(list) ? 0 : list.size(); 
    } 
} 

recycleview ngang bộ chuyển đổi

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

    private List<ResponseObject> mainPageResponseList; 
    private SearchActivity activity; 

    public ImageAdapter(SearchActivity activity, List mainPageResponseList) { 
     this.mainPageResponseList = mainPageResponseList; 
     this.activity = activity; 
    } 

    public ImageAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemLayoutView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.horizontal_layout_view, null); 
     ViewHolder viewHolder = new ViewHolder(itemLayoutView); 
     return viewHolder; 
    } 

    public void onBindViewHolder(ViewHolder viewHolder, int position) { 
     ResponseObject object = mainPageResponseList.get(position); 
     Util.setImageUsingGlide(object.getImage(), viewHolder.imageView); 
     viewHolder.packageName.setText(object.getDestination()); 
     viewHolder.packagePrice.setText(object.getPrice() + ""); 
     viewHolder.imageView.setOnClickListener(null); 
    } 

    public final static class ViewHolder extends RecyclerView.ViewHolder { 

     protected ImageView imageView; 
     protected TextView packageName; 
     protected TextView packagePrice; 

     public ViewHolder(View view) { 
      super(view); 
      this.imageView = (ImageView) view.findViewById(R.id.packageImage); 
      this.packageName = (TextView) view.findViewById(R.id.packageName); 
      this.packagePrice = (TextView) view.findViewById(R.id.packagePrice); 
     } 
    } 

    public int getItemCount() { 
     return ListUtil.isEmpty(mainPageResponseList) ? 0 : mainPageResponseList.size(); 
    } 
} 

main_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/main_content" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/white" 
android:fitsSystemWindows="true"> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:fitsSystemWindows="true" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

    <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/collapsing_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true" 
     app:contentScrim="?attr/colorPrimary" 
     app:expandedTitleMarginEnd="64dp" 
     app:expandedTitleMarginStart="48dp" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" 
      android:visibility="visible"> 

      <RelativeLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"> 

       <ImageView 
        android:id="@+id/ivHolidayMainImage" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:fitsSystemWindows="true" 
        android:scaleType="centerCrop" 
        app:layout_collapseMode="parallax" /> 

       <ImageView 
        android:id="@+id/ivHotelImage" 
        android:layout_width="match_parent" 
        android:layout_height="80dp" 
        android:layout_alignTop="@id/ivHolidayMainImage" 
      android:background="@drawable/gradient_from_up_hotel_image" /> 

       <RelativeLayout 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginLeft="10dp" 
        android:layout_marginRight="10dp" 
        android:layout_marginTop="250dp"> 
        <RelativeLayout 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_alignParentLeft="true"> 
         <TextView 
          android:id="@+id/mainPackageTitle" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:text="Popular Pick" 
          android:textColor="@color/white" 
          android:textSize="12dp" /> 
         <TextView 
          android:id="@+id/mainPackageName" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:layout_below="@+id/mainPackageTitle" 
          android:text="Andaman Islands" 
          android:textColor="@color/white" 
          android:textSize="18dp" /> 
        </RelativeLayout> 
        <RelativeLayout 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_alignParentRight="true" 
         android:layout_marginLeft="50dp" 
         android:layout_marginRight="10dp"> 
         <TextView 
          android:id="@+id/mainPackagePrice" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:text="25000" 
          android:textColor="@color/white" 
          android:textSize="18dp" /> 
         <TextView 
          android:id="@+id/journeyType" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:layout_below="@+id/mainPackagePrice" 
          android:text="Popular Pick" 
          android:textColor="@color/white" 
          android:textSize="12dp" /> 
        </RelativeLayout> 
       </RelativeLayout> 
      </RelativeLayout> 

      <ImageView 
       android:layout_width="match_parent" 
       android:layout_height="100dp" 
       android:layout_marginTop="-100dp" 
     android:background="@drawable/gradient_from_down_hotel_image" /> 
     </app.viaindia.views.ViaLinearLayout> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:layout_collapseMode="pin" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

    </android.support.design.widget.CollapsingToolbarLayout> 

</android.support.design.widget.AppBarLayout> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/main_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

<android.support.design.widget.FloatingActionButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:clickable="true" 
    android:src="@drawable/ic_sms_black" 
    app:layout_anchor="@id/appbar" 
    app:layout_anchorGravity="bottom|right|end" /> 

vertical_layout.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:orientation="vertical" 
android:paddingLeft="5dp" 
android:paddingRight="5dp"> 
<TextView 
    android:id="@+id/recycleViewTitle" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:text="Beaches" 
    android:textColor="@color/black_light" 
    android:textSize="20dp" /> 
<android.support.v7.widget.RecyclerView 
    android:id="@+id/recyclerView" 
    android:layout_width="match_parent" 
    android:layout_height="160dp" 
    android:layout_gravity="center" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

holizontal_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:viaCustom="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical"> 
<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <ImageView 
     android:id="@+id/packageImage" 
     android:layout_width="wrap_content" 
     android:layout_height="230dp" 
     android:scaleType="fitXY" 
     android:src="@drawable/cheese_1" /> 
    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="160dp"> 
     <TextView 
      android:id="@+id/tvNightAndDays" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="3 Night/4 days" 
      android:textColor="@color/white" /> 
    </RelativeLayout> 
</RelativeLayout> 

1

Cố gắng notifydatasetChanged() trong onbindViewHolder() không setAdapter(). SetAdapter() tốn nhiều thời gian hơn thông báo thay đổi datset.

+0

nhiều cải tiến bằng phương pháp trên – Bhupesh

Các vấn đề liên quan