Я знаю, что этот вопрос был задан с таким же названием, но достойного решения не было, отсюда и мой «дубликат».
при добавлении нового элемента в 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);
}
Однако это не самый изящный метод и не всегда работает. Есть ли лучший способ обойти это?




Еще одна идея:
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);
}
});
даже с scrollToPosition?
Я добавил еще один ответ
Это было то, что у меня было изначально, но не работает, так как "o" всегда будет нулевым