带有edittext的Listview - 在“下一个”上自动滚动

Posted

技术标签:

【中文标题】带有edittext的Listview - 在“下一个”上自动滚动【英文标题】:Listview with edittext - auto scroll on "next" 【发布时间】:2014-03-23 00:28:19 【问题描述】:

我有一个 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;
    

【问题讨论】:

【参考方案1】:

好的,经过长时间的努力,我终于找到了适合我的情况的 hack(不是正确的解决方案)。在我的适配器的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;
    
);

【讨论】:

【参考方案2】:

我对持有人一无所知,所以我找到了一种不用它的方法。 在 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();
            
          
      
);

【讨论】:

以上是关于带有edittext的Listview - 在“下一个”上自动滚动的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮时如何在android中获取带有ListView值的复选框,EditText?

如何在edittext中获取列表选定项目?

在每个子项中添加带有EditTexts的ListView - Android Studio

ListView + EditText => 糟糕的键盘行为

ListView 与 EditText 键盘问题

EditText 现在显示在 ListView 下