2014-02-21 2 views
8

У меня есть ListView с одним EditText в каждой строке (в дополнение к нескольким нередактируемым TextView). Когда я редактирую текст в EditText, на мягкой клавиатуре есть кнопка «Далее» - и нажатие на нее перемещает фокус в следующее поле - это здорово. В последней строке кнопка изменяется на «Готово».Listview с edittext - auto scroll on "next"

Я использую EditText.setImeOptions, чтобы установить кнопку «Готово» или «Далее» в зависимости от последней строки или нет.

Проблема в том, что в listview может быть больше строк, которые могут поместиться на экране. Когда это произойдет, нажатие «Далее» на следующей видимой строке снова перемещает фокус на первую строку. Как я могу заставить его прокрутить список и перейти к следующей строке?

Для справки, вот что я делаю в моем адаптере:

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

ответ

7

Хорошо, после того, как изо всех сил в течение длительного времени, я наконец-то нашел хак (не правильное решение), который работает для моего случая. В 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; 
    } 
}); 
+0

работал ... Thnax. –