首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >确定项目在RecyclerView上是否可见

确定项目在RecyclerView上是否可见
EN

Stack Overflow用户
提问于 2015-11-04 20:36:14
回答 1查看 13.4K关注 0票数 8

我已经在RecyclerView中构建了一个由CardView列表组成的基本接口。当添加卡片时,我需要知道它是否在屏幕上可见。

我试图通过使用布局管理器的findLastVisibleItemPosition()方法来获取它,但是它似乎返回的结果比预期的少了一项。例如,如果我有一张可见的卡,findLastVisibleItemPosition()将返回-1 (其中可见卡的索引应该是0)。

我简化的核心方法如下:

代码语言:javascript
运行
复制
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) {

    }
}

添加第一项时返回:

代码语言:javascript
运行
复制
Items size = 1, Last Visible Item = -1

添加第二项时返回:

代码语言:javascript
运行
复制
Items size = 2, Last Visible Item = 0
Items size = 2, Last Visible Item = 0

添加第三项时返回:

代码语言:javascript
运行
复制
Items size = 3, Last Visible Item = 0
Items size = 3, Last Visible Item = 1
Items size = 3, Last Visible Item = 1

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

有没有人可以帮我理解一下findLastVisibleItemPosition()的返回值,并建议如何在添加卡片时判断卡片是否在屏幕上可见?

EDIT:我应该澄清一下,我的真正目标是(使用我的addItem()方法)在添加项目时知道它是否可见。如果在addItem()方法中有一种简单的方法可以做到这一点,那就更好了。

EN

回答 1

Stack Overflow用户

发布于 2015-11-05 18:39:29

对于那些感兴趣的人,我已经通过在处理程序中调用findLastVisibleItemPosition解决了这个问题:

代码语言:javascript
运行
复制
@Override
public void onChildViewAttachedToWindow(View view) {

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

                System.out.println(llm.findLastVisibleItemPosition());
            }
        });
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33522127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档