确定项目是否在RecyclerView上可见

Rat*_*tty 6 android android-recyclerview

我已经构建了一个基本界面,其中包含一个CardView内部列表RecyclerView.添加卡后,我需要知道它是否在屏幕上可见.

我试图通过使用布局管理器的findLastVisibleItemPosition()方法获得这个,但它似乎返回一个项目少于预期的结果.例如,如果我有一张可见的卡片findLastVisibleItemPosition()返回-1(我希望看到可见卡片的索引0).

我简化的核心方法如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    items = new ArrayList<>();

    RecyclerView recycList = (RecyclerView) findViewById(R.id.rv);
    recycList.setHasFixedSize(true);
    llm = new LinearLayoutManager(this);
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    recycList.setLayoutManager(llm);
    recycList.addOnChildAttachStateChangeListener(new ChildAttachListener(llm));
    adapter = new RecycAdapter(items);
    recycList.setAdapter(adapter);
}

private void addItem(){
    items.add(new Item());
    adapter.notifyDataSetChanged();
}

private class ChildAttachListener implements OnChildAttachStateChangeListener{
    LinearLayoutManager llm;

    public ChildAttachListener(LinearLayoutManager llm){
        super();
        this.llm = llm;
    }

    @Override
    public void onChildViewAttachedToWindow(View view) {

        System.out.println("Items size = "+items.size() + ", Last Visible Item = "+llm.findLastVisibleItemPosition());
    }

    @Override
    public void onChildViewDetachedFromWindow(View view) {

    }
}
Run Code Online (Sandbox Code Playgroud)

添加第一个项目时返回:

Items size = 1, Last Visible Item = -1
Run Code Online (Sandbox Code Playgroud)

添加第二个项目时返回:

Items size = 2, Last Visible Item = 0
Items size = 2, Last Visible Item = 0
Run Code Online (Sandbox Code Playgroud)

添加第三项时返回:

Items size = 3, Last Visible Item = 0
Items size = 3, Last Visible Item = 1
Items size = 3, Last Visible Item = 1
Run Code Online (Sandbox Code Playgroud)

在所有情况下,所有项目都是可见的(我可以在屏幕上显示7个可见项目).

有人可以帮我理解返回findLastVisibleItemPosition()并建议我如何确定添加卡时屏幕上是否可见卡片?

编辑: 我应该澄清,我的真正目标是在添加项目时使用我的addItem()方法知道项目是否可见.如果在方法中有一种简单的addItem()方法可以做得更好.

Rat*_*tty 12

对于那些感兴趣的人,我通过在Handler中调用findLastVisibleItemPosition解决了这个问题:

@Override
public void onChildViewAttachedToWindow(View view) {

    Handler handler = new Handler();
        handler.post(new Runnable() {
            @Override
            public void run() {

                System.out.println(llm.findLastVisibleItemPosition());
            }
        });
}
Run Code Online (Sandbox Code Playgroud)