2014-02-21 1 views
8

두 개의 편집 할 수없는 TextView에 추가하여 각 행에 하나의 EditText가있는 ListView가 있습니다. EditText에서 텍스트를 편집 할 때, 소프트 키보드는 "다음"버튼을 가지고 있습니다 - 그리고 그것을 누르면 다음 필드로 포커스가 이동합니다 - 이것은 훌륭합니다. 마지막 행에서 버튼이 '완료'로 변경됩니다.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; 
    } 
} 

답변

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

worked ... Thnax. –

관련 문제