2

我正在使用FirebaseRecyclerAdapter从Firebase获取数据并填充回收站视图。代码工作正常,但是当我开始滚动时,回收站视图使用每次滚动都会调用PopulateViewHolder方法,这使得滚动滞后很多,有时在回收站视图的开始时会丢失一些数据。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)); 
    } 
} 

及邮政类模型包含了每个职位的getter和setter方法和字段。

的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调用此方法以在指定位置显示数据。

当您滚动时,您将开始获取用于排除屏幕的行的视图持有者,并且您必须用新数据替换旧数据。
为此,调用此方法。

检查您的代码。
如果在此步骤中存在一些耗时的方法(例如,如果您加载图像),则应使用异步任务。

相关问题