Android edittext в списке просмотра теряет фокус на вызовы - PullRequest
19 голосов
/ 02 марта 2012

У меня есть несколько правок в тексте списка.У меня есть стандартный focuslistener для текста редактирования, который обновляет значение модели данных, а также фон текста редактирования, когда фокус теряется при вызове notifydatachanged.Проблема в том, что если один из текстов редактирования удерживает фокус, когда я касаюсь следующего текста редактирования, он мгновенно получает фокус, а затем теряет фокус.Я подозреваю, что это происходит из-за вызова метода notifydatachanged, который вызывает перерисовку всех представлений, после чего фокус теряется.У кого-нибудь есть предложение или обойти эту проблему?Спасибо.

Ответы [ 5 ]

19 голосов
/ 02 марта 2012

Это действительно происходит, потому что все виды перерисовываются, поэтому текст редактирования, представляющий какую-либо строку, которая раньше была сфокусированной, теперь является совершенно другим объектом. Установите переменную в вашем адаптере: int currentFocusedRow;

в getView для вашего адаптера: добавьте прослушиватель onFocusChanged для каждого редактируемого текста, и когда этот текст редактирования приобретает фокус, установите currentFocusedRow = любую строку, в которой находится фокусированный текст редактирования. Также установите любой текст редактирования, который находится в текущемFocusedRow, чтобы быть сосредоточены.

18 голосов
/ 05 декабря 2012

Установите

android:windowSoftInputMode="adjustPan"

для вашей активности в AndroidManifest.xml

6 голосов
/ 06 октября 2012

У меня также была проблема, когда EditText терял фокус, но вызов setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS) решил ее.

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    final ListView lv = getListView();
    lv.setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS);
}
1 голос
/ 21 сентября 2016

Для будущих пользователей все здесь слишком сложно.Правильный ответ - добавить

android:descendantFocusability="afterDescendants"

в список просмотра.

0 голосов
/ 12 апреля 2017

Пример реализации предложения Сэма Джадда с дополнительным переключателем use_last_focus

public class my_friends_adapter extends ArrayAdapter<group_user> {
    boolean use_last_focus=false;
    int currentlyFocusedRow=-1;
    String currentlyFocusedField="";

    public my_friends_adapter(Context context, int resource, ArrayList<group_user> users) {
            super(context, resource, users);
              }
        EditText tvName,tvEmail;

    @Override
   public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) convertView = LayoutInflater.from(getContext()).inflate(R.layout.my_friends_item, parent, false);
        tvName = (EditText) convertView.findViewById(R.id.tvName);
        tvEmail = (EditText) convertView.findViewById(R.id.tvEmail);
        if (use_last_focus && currentlyFocusedRow ==position){
            if (currentlyFocusedField=="tvName")tvName.requestFocus();
            else tvEmail.requestFocus();
            use_last_focus=false;
        }
        tvName.setTag(position);//When focus is lost save the entered value for later use
        tvName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {save_data2( v,  hasFocus);
            }
        });

        tvEmail.setTag(position);//When focus is lost save the entered value for later use
        tvEmail.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {save_data2( v,  hasFocus);}
        });

        return convertView;
        }


    public  void save_data2(View v, boolean hasFocus){
        int position = (Integer) v.getTag();
        EditText tvName1 = (EditText) v.findViewById(R.id.tvName);
        EditText tvEmail1 = (EditText) v.findViewById(R.id.tvEmail);
        boolean data_changed=false;
        if (hasFocus) currentlyFocusedRow=position;
        if (!(tvName1==null)) {
            if (hasFocus) currentlyFocusedField="tvName";
        }
        if (!(tvEmail1==null)) {
            if (hasFocus) currentlyFocusedField="tvEmail";
        }
        // set when data_changed
        // ..........
        if (!hasFocus && data_changed) {
            //your code to save the changed data
            // ...............
            //
            my_friends.adapter.notifyDataSetChanged();
            use_last_focus=true;
        }

    }



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...