首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >findViewHolderForAdapterPosition()返回null

findViewHolderForAdapterPosition()返回null
EN

Stack Overflow用户
提问于 2018-09-16 22:59:59
回答 1查看 193关注 0票数 -2

我知道这个问题已经被问到了完全相同的标题,但没有提供一个像样的解决方案,因此我提出了“复制品”。

在向recyclerView添加新项时,我希望将焦点设置到最新的项(它是EditText的列表)。但是,由于重新计算视图,调用"findViewHolderForAdapterPosition“将返回null。在调用函数之前等待半秒就可以解决这个问题,如下所示

代码语言:javascript
复制
addOptionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                optionsAdapter.addOption();
                optionsRecyclerView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        int last = optionsAdapter.getItemCount()-1;
                        OptionsAdapter.OptionViewHolder o = (OptionsAdapter.OptionViewHolder) optionsRecyclerView.findViewHolderForAdapterPosition(last);
                        o.editText.setSelected(true);
                    }
                },500);
            }
        });

//OptionsAdapter class
public void addOption()
{
    values.add("");
    notifyItemInserted(values.size()-1);
}

然而,它不是最整洁的方法,也不总是有效的。有没有更好的办法绕过它呢?

EN

回答 1

Stack Overflow用户

发布于 2018-09-17 01:40:45

编辑:

另一个想法是:

代码语言:javascript
复制
addOptionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            optionsAdapter.addOption();
            int last = optionsAdapter.getItemCount()-1;
            optionsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                int lastVisible = layoutManager.findLastVisibleItemPosition();
                if (lastVisible == last) {
                    optionsRecyclerView.removeOnScrollListener(this);
                    OptionsAdapter.OptionViewHolder o = (OptionsAdapter.OptionViewHolder) optionsRecyclerView.findViewHolderForAdapterPosition(last);
                    o.editText.setSelected(true);
                }
            }
            optionsRecyclerView.scrollToPosition(last);
        }
    });

试试这个:

代码语言:javascript
复制
addOptionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            optionsAdapter.addOption();
            int last = optionsAdapter.getItemCount()-1;
            optionsRecyclerView.scrollToPosition(last);
            OptionsAdapter.OptionViewHolder o = (OptionsAdapter.OptionViewHolder) optionsRecyclerView.findViewHolderForAdapterPosition(last);
            o.editText.setSelected(true);
        }
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52355393

复制
相关文章

相似问题

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