Listview с edittext - автоматическая прокрутка на "следующий"
У меня есть ListView с одним EditText в каждой строке (в дополнение к пару нередактируемых TextView). Когда я редактирую текст в EditText, на программной клавиатуре есть кнопка "Далее" - и нажатие на нее перемещает фокус на следующее поле - это здорово. В последнем ряду кнопка меняется на "Готово".
я использую EditText.setImeOptions
установить кнопку "Готово" или "Далее" в зависимости от того, последняя строка или нет.
Проблема в том, что у списка может быть больше строк, которые могут поместиться на экране. Когда это происходит, нажатие "Next" в следующей видимой строке снова перемещает фокус на первую строку. Как я могу заставить его прокрутить список и перейти к следующему ряду?
Для справки, вот что я делаю в своем адаптере:
public class AuditAdapter extends BaseAdapter {
private Context context;
private int layoutResourceId;
private Audit audit;
...
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
final AuditItemHolder holder = (row == null ? new AuditItemHolder() : (AuditItemHolder)row.getTag());
if(row == null)
{
LayoutInflater inflater = ...;
row = inflater.inflate(layoutResourceId, parent, false);
...
holder.qtyf = (EditText)row.findViewById(R.id.item_quantity);
}
AuditItem item = audit.getItemAt(position);
holder.qtyf.setText("" + item.getQuantity());
holder.qtyf.setImeOptions(position == audit.size() - 1 ? EditorInfo.IME_ACTION_DONE : EditorInfo.IME_ACTION_NEXT);
...
row.setTag(holder);
return row;
}
private static class AuditItemHolder {
...
EditText qtyf;
}
}
2 ответа
Хорошо, после долгой борьбы я наконец нашел хак (не правильное решение), который работает для моего случая. в getView
моего адаптера, я добавляю onEditorActionListener
и внутри него:
ediField.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
ListView lv = (ListView)parent;
if(actionId == EditorInfo.IME_ACTION_NEXT &&
lv != null &&
position >= lv.getLastVisiblePosition() &&
position != audit.size() - 1) { //audit object holds the data for the adapter
lv.smoothScrollToPosition(position + 1);
lv.postDelayed(new Runnable() {
public void run() {
TextView nextField = (TextView)holderf.qtyf.focusSearch(View.FOCUS_DOWN);
if(nextField != null) {
nextField.requestFocus();
}
}
}, 200);
return true;
}
return false;
}
});
Я понятия не имею о держателе, поэтому я нашел способ обойтись без него. Внутри getView добавьте onEditorActionListener.
EditText editView = (EditText)convertView;
editView.editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(final TextView view, int actionId, KeyEvent event){
if(actionId == EditorInfo.IME_ACTION_NEXT){
int lastPos = lv.getLastVisiblePosition();
lv.smoothScrollToPosition(position + 1);
if(position >= lastPos){
lv.postDelayed(new Runnable(){
@Override
public void run(){
final int posTop = lv.getFirstVisiblePosition();
TextView nextView = (EditText)lv.getChildAt(position - posTop + 1);
nextView.requestFocus();
}
}, 200);
}
//Delay is not required
else{
final int posTop = lv.getFirstVisiblePosition();
TextView nextView = (EditText)lv.getChildAt(position - posTop + 1);
nextView.requestFocus();
}
}
}
});