EditText теряет фокус в ListView

Я уже прочитал множество подобных вопросов, но не нашел решения, которое решило бы мою проблему, поэтому, пожалуйста, не отмечайте это как дубликат.

У меня есть ListFragment с FrameLayout, содержащим ListView, заполненным через custom ArrayListAdapter. Каждая строка списка состоит из трех элементов:

Checkbox, EditText и ImageButton.

Моя проблема в том, что когда я нажимаю на EditText, чтобы изменить string, он содержит клавиатуру, но фокус сразу же исчезает, и я не могу писать.

Обратите внимание, что я уже добавил в свой Activity файл manifest

android:windowSoftInputMode="adjustResize"

даже

android:descendantFocusability="afterDescendants" android:descendantFocusability="beforeDescendants"

не решает проблему.

Вот мой XML-код:

row_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/item_checkbox"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    />

<EditText
    android:id="@+id/item_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="60px"
    android:text="Test text"
    android:singleLine="true"
    android:layout_toRightOf="@id/item_checkbox"
    android:layout_centerVertical="true"
    android:layout_toLeftOf="@+id/item_important"
    android:layout_toStartOf="@+id/item_important" />

<ImageButton
    android:id="@+id/item_important"
    android:layout_width="20dip"
    android:layout_height="20dip"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="10dp"
    android:visibility="visible"
    android:layout_marginLeft="10dp" />

</RelativeLayout>

фрагмент_список.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"
    >

    <ListView android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
     />

</FrameLayout>

Было бы здорово, если бы вы могли предложить мне какой-нибудь ресурс, где можно понять, как работает фокусируемость в этом случае.

Спасибо


ОБНОВИТЬ

Я обнаружил, что проблема создается появлением клавиатуры: я предполагаю, что повторное использование представления является причиной того, что EditText теряет фокус.


person Alessandro91    schedule 13.01.2015    source источник
comment
Возможный дубликат stackoverflow.com/questions/2679948/   -  person Cool    schedule 13.01.2015
comment
Я уже пробовал это решение, к сожалению, не решает проблему...   -  person Alessandro91    schedule 14.01.2015


Ответы (3)


Я решил свою проблему, используя новый класс RecyclerView. Кажется, это была проблема ListView

person Alessandro91    schedule 31.03.2015

Попробуйте этот код

row_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<CheckBox
    android:id="@+id/item_checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true" 
    android:focusable="false"/>

<EditText
    android:id="@+id/item_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_toLeftOf="@+id/item_important"
    android:layout_toRightOf="@id/item_checkbox"
    android:layout_toStartOf="@+id/item_important"
    android:minHeight="60px"
    android:focusable="true"
    android:singleLine="true" />

<ImageButton
    android:id="@+id/item_important"
    android:layout_width="20dip"
    android:layout_height="20dip"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:visibility="visible" />

</RelativeLayout>

fragment_list.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="8dp"
android:paddingRight="8dp"
>

 <ListView
    android:id="@id/android:list"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:descendantFocusability="beforeDescendants"/>

</FrameLayout>

Код активности

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_list);

    ArrayList<String> mArrayList = new ArrayList<String>();
    /**mArrayList.add("Test");
    mArrayList.add("Test");
    mArrayList.add("Test");
    mArrayList.add("Test");**/

    CustomeAdapter adapter = new CustomeAdapter(this, mArrayList);
    ListView listView = (ListView) findViewById(android.R.id.list);
    listView.setItemsCanFocus(true);
    listView.setAdapter(adapter);
}

public class CustomeAdapter extends ArrayAdapter {

    ArrayList<String> mArrayList;
    @SuppressWarnings("unchecked")
    public CustomeAdapter(Context context, ArrayList<String> users) {
        super(context, R.layout.row_item, users);
        mArrayList = new ArrayList<String>();
        mArrayList = users;
    }

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

        ViewHolder viewHolder; // view lookup cache stored in tag
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_item, parent, false);
            viewHolder.mCheckBox = (CheckBox) convertView.findViewById(R.id.item_checkbox);
            viewHolder.mEditText = (EditText) convertView.findViewById(R.id.item_text);
            viewHolder.mImageView = (ImageView) convertView.findViewById(R.id.item_important);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.mEditText.setText(mArrayList.get(position));
        return convertView;
    }

    // View lookup cache
    private class ViewHolder {
        CheckBox mCheckBox;
        EditText mEditText;
        ImageView mImageView;
    }
}
person rahul baraiya    schedule 16.01.2015
comment
Спасибо, я попробовал ваш код на своем мобильном устройстве с Android API 16, и у него все та же проблема. Затем я протестировал его на виртуальном устройстве с Android API 21, и он работает. Ты знаешь почему? - person Alessandro91; 17.01.2015

Вы установили android:focusable="true" и android:focusableInTouchMode="true" на свой EditText?

Также android:windowSoftInputMode="adjustPan" в вашем файле AndroiManifest.

person Sam Chen    schedule 22.08.2019