2015-09-03 16 views
8

Tôi đã xử lý một hành vi lạ trong Chế độ xem Recycler, nếu số lượt xem trong bộ điều hợp nhỏ, trong trường hợp của tôi với kích thước 5, các chế độ xem không được tái chế và onBindViewHolder không được gọi khi khung nhìn được cuộn trở lại màn hình. Ví dụ: nếu tôi tăng kích thước lên 10 chế độ xem, thì quá trình tái chế sẽ bắt đầu hoạt động và onBindViewHolder được gọi mỗi lần xem vào màn hình.RecyclerView không xem lại chế độ xem nếu số lượt xem nhỏ

XML

<android.support.v4.widget.SwipeRefreshLayout 
    android:id="@+id/swipeRefresh" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <!-- RECYCLER VIEW --> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/eventsList" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

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

xem Recycler khởi

LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 

    eventsList.setLayoutManager(llm); 

    //Sets endless listener 
    scrollListener = new EndlessRecyclerOnScrollListener(llm,3,mLastDownloadedPage) { 
     @Override 
     public void onLoadMore(int current_page) { 
      Timber.d("Loading date for page: " + current_page); 

      mLastDownloadedPage = current_page; 

      //If it's showing cached don't download 
      if(showingCached) 
       return; 

      //Shows snackbar loading view 
      showSnackbarLoadingView(); 

      //Gets events 
      getEvents(false); 

     } 
    }; 

    //eventsList.addOnScrollListener(scrollListener); 

    //Set the adapter 
    mAdapter = new EventListAdapter(this,getActivity().getApplicationContext()); 

    eventsList.setAdapter(mAdapter); 

Các Adaptor

@Override 
public EventHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 

    Timber.d("Create view holder pos: "+i); 

    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_events_row, viewGroup, false); 
    return new EventHolder(v,mListener); 

} 

@Override 
public void onBindViewHolder(EventHolder eventHolder, int i) { 

    if(mBindListener != null) 
     mBindListener.onBind(eventHolder,i); 

    Timber.d("Bind view holder pos "+i); 

    Event event = eventList.get(i); 
    eventHolder.bindEvent(event); 

    //Sets the date 
    setDate(eventHolder.date, event); 

    //Sets the location 
    setLocation(eventHolder.distance,event); 


} 

Trong màn hình chỉ có 3 ảnh nhìn thấy được, với kích thước 5, khi tôi di chuyển tôi có thể thấy rằng createViewHolderbindViewHolder được gọi cho vị trí 4 và 5, nhưng khi tôi di chuyển lên trên, chúng không được tái chế khi thoát khỏi màn hình. Tôi có thể xác nhận rằng bởi vì bằng cách ghi đè

@Override 
public void onViewRecycled(EventHolder holder) { 
    super.onViewRecycled(holder); 
    Timber.d("onViewRecycled: "+holder.name); 
} 

không có thư nào được ghi lại. Tuy nhiên, nếu số lượt xem tăng ví dụ với kích thước 10, mọi thứ hoạt động tốt, các chế độ xem được tái chế và onBindViewHolder được gọi cho mọi vị trí.

Đây có phải là hành vi bình thường không? Nếu đó là cách tôi có thể lưu trạng thái của chế độ xem mục, ví dụ trạng thái được kích hoạt, tôi sử dụng để lưu vị trí hoạt động trong một biến và sau đó sử dụng dòng này để kích hoạt chế độ xem khi nó vào màn hình bằng cách sử dụng phương pháp liên kết

 holder.itemView.setActivated(pos == lastSelectedPos); 

Trả lời

15

đó là hành vi bình thường, nhưng bạn có thể tinh chỉnh nó với:

recyclerView.setItemViewCacheSize(int); 

về phần thứ hai của câu hỏi - bạn nói đúng! Lưu trữ vị trí "đã kích hoạt" dưới dạng biến trong bộ điều hợp của bạn. Trong onBindViewHolder() làm điều gì đó như:

holder.itemView.setActivated(holder.getAdapterPosition() == lastSelectedPos); 
+0

Cảm ơn này giải quyết nó –

+13

Chỉ cần đề cập đến, khi tôi đào bên trong 'recyclerView.setItemViewCacheSize() ', giá trị mặc định cho bộ nhớ cache là ** 2 **. – kirtan403

+0

Cảm ơn bạn kirtan403 Tôi đã tìm mọi nơi cho điều đó. – esfox

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