Подтвердить что ты не робот

Android ListView setSelection(), похоже, не работает

У меня есть ListActivity, который реализует onListItemClick() и вызывает функцию doSomething() класса. Последний содержит l.setSelection(position), где l - объект ListView.

Теперь есть onClickListener() прослушивание нажатия кнопки, которое выполняет некоторые действия, и это тоже вызывает doSomething().

В первом случае выбранный элемент позиционируется соответствующим образом, но в последнем случае ничего не происходит.

Любые подсказки об этом странном поведении и о том, как я могу заставить его работать?

4b9b3361

Ответ 1

возможно, вам нужно использовать функцию:

ListView.setItemChecked(int position, boolean checked);

Ответ 2

используйте requestFocusFromTouch() перед вызовом метода setSelection()

Ответ 3

Я знаю, что это старый вопрос, но у меня была аналогичная проблема, которую я решил таким образом:

mListView.clearFocus();
mListView.post(new Runnable() {
    @Override
    public void run() {
        mListView.setSelection(index);
    }
});

Ответ 4

Вам может потребоваться обернуть setSelection() в post ed Runnable (ссылка).

Ответ 5

setSelection() не обязательно визуально. Панель выбора появляется, только если вы используете D-pad/trackball для навигации по списку. Если вы нажмете на экран, чтобы щелкнуть что-то, панель выбора появится ненадолго и исчезнет.

Следовательно, setSelection() будет иметь только визуальное воздействие, если активность не находится в режиме касания (т.е. последнее, что сделал пользователь, это использовать D-pad/trackball).

Я не на 100% уверен, что это объясняет ваше явление, учитывая приведенное вами описание, но я подумал, что это стоит того...

Ответ 6

Если вы используете адаптер для своего списка, добавьте этот код в свой адаптер:

public class MyAdapter extends
        ArrayAdapter<MyClass> {


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflator = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflator.inflate(R.layout.my_adapter, null);
        } else {
            rowView = (View) convertView;
        }

        //...

        // set selected item
        LinearLayout ActiveItem = (LinearLayout) rowView;
        if (position == selectedItem)
        {
            ActiveItem
                    .setBackgroundResource(R.drawable.background_dark_blue);

            // for focus on it
            int top = (ActiveItem == null) ? 0 : ActiveItem.getTop();
            ((ListView) parent).setSelectionFromTop(position, top);
        }
        else
        {
            ActiveItem
                    .setBackgroundResource(R.drawable.border02);
        }

    }

    private int selectedItem;

    public void setSelectedItem(int position) {
        selectedItem = position;
    }

}

В вашей деятельности:

myAdapter.setSelectedItem(1);

Ответ 7

Может быть, вы должны использовать метод smoothScrollToPosition (int position) ListView

Ответ 8

Для меня вызов

listView.notifyDataSetChanged();
listView.requestFocusFromTouch();

а затем

 listView.setSelection(position);

решил проблему.

если вы делаете это в runnable, он работает без вызова requestFocusFromTouch(), но старая позиция ListView отображается для sekound.

Ответ 9

У меня очень большой запрос с Webcontent. Когда я использовал код в onCreateView, Listview даже не закончил загрузку. Я положил его в onPostExecute моей AsyncTask.

            //Get last position in listview
        if (listView != null && scrollPosition != 0) {
            listView.clearFocus();
            listView.requestFocusFromTouch();
            listView.post(new Runnable() {
                @Override
                public void run() {
                    listView.setItemChecked(scrollPosition, true);
                    listView.setSelection(scrollPosition);
                }
            });
        }

Не забудьте установить элемент, отмеченный кнопкой Click;)

Ответ 10

В моем случае работала функция smoothScrollToPosition (int position), можете ли вы также рассказать мне, как установить эту прокрученную позицию в центр списка. Он появился в нижней части видимых предметов.

Ответ 11

Для меня это помогло установить ListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); или ListView.CHOICE_MODE_MULTIPLE
затем
ListView.setSelection(position) или ListView.setItemChecked(position, true);
отлично работает

Ответ 12

Нашел решение в моем случае. Я не использую Runnable, так как мой класс расширяет ListFragment. Мне нужно было сделать мой индекс последним; конечный индекс = 5; mListView.setSelection(индекс);

Ответ 13

Я обнаружил, что иногда setSelection не работает, потому что я устанавливаю атрибут "android: height" listView в "wrap_content".

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

Например, если мое приложение "Приложение для браузера файлов". Когда мой список меньше, скажем, 6, то он не прокручивается. Теперь я возвращаюсь в родительский каталог и имеет 11 объектов, и я хочу установить выделение в какую-то позицию, и он не будет работать здесь.

to\from    |    Scrollable  | non-Scrollable

Прокручиваемый | O | O (конечно)

не прокручиваемый | X | O (конечно)

Я не хочу использовать post (Runnable), потому что будет задержка.

==================================

Ответ:

Вы можете попробовать установить "android: height" в "match_parent"

Бог, он проводит три дня.

Ответ 14

При использовании сообщения setSelection() сначала будет отображаться ListView, затем прокрутите до позиции, благодаря " 魏經軒", тогда макет фактически произведет эффект setSelection(), потому что setSelection() вызовите setSelectionFromTop(int position, int y), есть другой способ его решить.

listView.setAdapter(listView.getAdapter());
listView.setSelection(123);

Ответ 15

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

  listView.setAdapter(adapter);
  listView.setSelection(position);
  adapter.notifyDataSetChanged(); 

Ответ 16

Для меня решение этой проблемы:

listView.clearChoices();