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();
            }
          }
      }
});
Другие вопросы по тегам