如何知道RecyclerView何时完成了物品的放置?

我有一个在CardViewCardView的高度为500dp,但如果RecyclerView较小,我想缩短此高度。 所以我想知道在RecyclerView第一次完成放置项目时是否有任何监听器被调用,从而可以将RecyclerView的高度设置为CardView的高度(如果小于500dp)。

在我的回收器视图完成对所有元素的膨胀之后,我还需要执行代码。 我尝试在我的适配器中检入onBindViewHolder ,如果位置是最后一个,然后通知观察者。 但在那时,回收者的观点仍然没有完全填充。

由于RecyclerView实现了ViewGroup , 因此这个anwser非常有用。 您只需要将一个OnGlobalLayoutListener添加到recyclerView:

  View recyclerView = findViewById(R.id.myView); recyclerView.getViewTreeObserver() .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //At this point the layout is complete and the //dimensions of recyclerView and any child views are known. //Remove listener after changed RecyclerView's height to prevent infinite loop recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); 

@andrino anwser的工作修改。

正如@Juancho在上面的评论中指出的那样。 这种方法被多次调用。 在这种情况下,我们希望它只被触发一次。

使用实例创建自定义侦听器

 private RecyclerViewReadyCallback recyclerViewReadyCallback; public interface RecyclerViewReadyCallback { void onLayoutReady(); } 

然后在RecyclerView上设置OnGlobalLayoutListener

 recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (recyclerViewReadyCallback != null) { recyclerViewReadyCallback.onLayoutReady(); } recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); 

之后,您只需要使用代码实现自定义侦听器

 recyclerViewReadyCallback = new RecyclerViewReadyCallback() { @Override public void onLayoutReady() { // //here comes your code that will be executed after all items are laid down // } }; 

我一直在努力尝试在触发后删除OnGlobalLayoutListener ,但会抛出IllegalStateException 。 因为我需要的是将我的recyclerView滚动到第二个元素,我所做的是检查它是否已经有了孩子,如果这是第一次这是真的,那么我只做滚动:

 public class MyActivity extends BaseActivity implements BalanceView { ... private boolean firstTime = true; ... @Override protected void onCreate(Bundle savedInstanceState) { ... ViewTreeObserver vto = myRecyclerView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (myRecyclerView.getChildCount() > 0 && MyActivity.this.firstTime){ MyActivity.this.firstTime = false; scrollToSecondPosition(); } } }); } ... private void scrollToSecondPosition() { // do the scroll } } 

HTH有人!

(当然,这是受到@andrino和@Phatee答案的启发)

对我有用的是在设置RecyclerView适配器后添加监听器。

 ServerRequest serverRequest = new ServerRequest(this); serverRequest.fetchAnswersInBackground(question_id, new AnswersDataCallBack() { @Override public void done(ArrayList returnedListOfAnswers) { mAdapter = new ForumAnswerRecyclerViewAdapter(returnedListOfAnswers, ForumAnswerActivity.this); recyclerView.setAdapter(mAdapter); recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { progressDialog.dismiss(); } }); } }); 

在全局布局状态或视图树中视图的可见性发生更改后,这将取消“progressDialog”。