2

Я использую FirebaseRecyclerAdapter, чтобы получить данные из Firebase и заполнить вид ресайклера. Код работает нормально, но когда я начинаю прокручивать, просмотр recycler вызывает метод PopulateViewHolder с каждым прокруткой, который сильно задерживает прокрутку, а иногда я теряю некоторые данные в начале просмотра recycler.FirebaseRecyclerAdapter, PopulateViewHolder вызывается много раз при прокрутке

мой код:

final FirebaseRecyclerAdapter<Post, PostsViewHolder> adapt = new FirebaseRecyclerAdapter<Post, PostsViewHolder>(Post.class, R.layout.layout_cardview, PostsViewHolder.class, mRef) { 

     @Override 
     protected void populateViewHolder(PostsViewHolder viewHolder, Post model, int position) { 
      Log.i("CHECK", "POPULATEVIEWHOLDER"); 
      test.setLongitude(model.getLongitude()); 
      Log.d("LONGITUDE", model.getLongitude() + ""); 
      test.setLatitude(model.getLatitude()); 
      Log.d("LATITUDE", test.getLatitude() + ""); 
      try { 
       if ((location.distanceTo(test)/1000.0) < 10) { 
        viewHolder.Content.setText(model.getContent()); 
        viewHolder.Time.setText(model.getTime()); 
       } else { 
        viewHolder.delete(); 
       } 
      }catch(Exception e){ 
       Toast.makeText(getApplicationContext(), "Please Make sure Location is enabled", Toast.LENGTH_LONG).show(); 
      } 
     } 
    }; 
    adapt.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
     @Override 
     public void onItemRangeInserted(int positionStart, int itemCount) { 
      super.onItemRangeInserted(positionStart, itemCount); 
      rv.getLayoutManager().smoothScrollToPosition(rv,null,positionStart); 
     } 
    }); 

PostsViewHolder является:

public static class PostsViewHolder extends RecyclerView.ViewHolder{ 

    TextView Content; 
    TextView Time; 
    CardView cv; 

    public PostsViewHolder(View v) { 
     super(v); 
     Content = (TextView) v.findViewById(R.id.textview_descriptionBrief); 
     cv = (CardView) v.findViewById(R.id.post_cardview); 
     Time = (TextView) v.findViewById(R.id.textView_time); 
    } 

    public void delete(){ 
     cv.setLayoutParams(new RecyclerView.LayoutParams(0,0)); 
    } 
} 

и модель класса Post содержит методы получения и установки и поля для каждой должности.

XML, для списка:

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/activity_lookup" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/colorWhite" 
tools:context="com.app.postit.postit.LookupActivity"> 

<!--<android.support.v7.widget.Toolbar 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/colorPrimary" 
    android:id="@+id/toolbar_lookupActivity"> 

</android.support.v7.widget.Toolbar>--> 

<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scrollbars="vertical" 
    android:id="@+id/recyclerview_lookupActivity" 
    /> 

<android.support.design.widget.FloatingActionButton 
    android:layout_width="48dp" 
    android:layout_height="48dp" 
    android:layout_alignParentEnd="true" 
    android:layout_alignParentBottom="true" 
    android:layout_marginRight="10dp" 
    android:layout_marginBottom="10dp" 
    android:id="@+id/button_floatingButton" 
    android:scaleType="center" 
    app:backgroundTint="@color/colorWhite" 
    app:fabSize="mini" 
    android:src="@drawable/ic_add_circle_blue_48dp" 
    app:elevation="5dp" 
    /> 

Менеджер компоновки представляет собой линейный менеджер компоновки и метод, содержащий адаптер вызывался только один раз в onCreatemethod.

ответ

2

Это правильно.
Метод populateViewHolder вызывается методом onBindViewHolder.

Вы можете проверить official javadoc.
Этот метод вызывается RecyclerViewдля отображения данных в указанной позиции.

Как вы прокрутите, вы начнете получать держатели для просмотра, которые использовались для строк, которые выходили из экрана, и вам нужно заменить старые данные, которые они хранят с новыми данными.
Для этого вызывается этот метод.

Проверьте свой код.
Если на этом этапе существуют некоторые трудоемкие методы (например, если вы загружаете изображения), вы должны использовать асинхронные задачи.