findViewHolderForAdapterPosition()返回null

时间:2018-09-16 14:59:59

标签: java android

我知道这个问题的标题完全相同,但是没有提供一个体面的解决方案,因此是“重复”。

在将新项目添加到recyclerView时,我想将焦点设置为最新项目(这是EditText的列表)。但是,由于重新计算视图,因此调用“ findViewHolderForAdapterPosition”将返回null。可以通过在调用如下所示的函数之前等待半秒钟来解决此问题

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);
}

但是,它不是最整洁的方法,也不总是有效。也许有更好的解决方法?

1 个答案:

答案 0 :(得分:0)

编辑:

另一个想法:

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);
        }
    });

尝试一下:

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);
        }
    });