带有edittext的Listview - 自动滚动"下一步"

Ale*_*s G 10 android listview scroll android-edittext imeoptions

我有一个ListView,每行有一个EditText(除了几个不可编辑的TextView).当我在EditText中编辑文本时,软键盘有"下一步"按钮 - 按下它会将焦点移动到下一个字段 - 这很棒.在最后一行,按钮变为"完成".

EditText.setImeOptions用来根据这是否是最后一行将按钮设置为"完成"或"下一步".

问题是列表视图可以有更多的行可以适应屏幕.当发生这种情况时,在下一个可见行上按"下一步"将焦点再次移动到第一行.如何让它滚动列表并转到下一行呢?

作为参考,这是我在适配器中正在做的事情:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*s G 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;
    }
});
Run Code Online (Sandbox Code Playgroud)