Ответ 1
возможно, вам нужно использовать функцию:
ListView.setItemChecked(int position, boolean checked);
У меня есть ListActivity
, который реализует onListItemClick()
и вызывает функцию doSomething()
класса. Последний содержит l.setSelection(position)
, где l
- объект ListView
.
Теперь есть onClickListener()
прослушивание нажатия кнопки, которое выполняет некоторые действия, и это тоже вызывает doSomething()
.
В первом случае выбранный элемент позиционируется соответствующим образом, но в последнем случае ничего не происходит.
Любые подсказки об этом странном поведении и о том, как я могу заставить его работать?
возможно, вам нужно использовать функцию:
ListView.setItemChecked(int position, boolean checked);
используйте requestFocusFromTouch()
перед вызовом метода setSelection()
Я знаю, что это старый вопрос, но у меня была аналогичная проблема, которую я решил таким образом:
mListView.clearFocus();
mListView.post(new Runnable() {
@Override
public void run() {
mListView.setSelection(index);
}
});
Вам может потребоваться обернуть setSelection()
в post
ed Runnable
(ссылка).
setSelection()
не обязательно визуально. Панель выбора появляется, только если вы используете D-pad/trackball для навигации по списку. Если вы нажмете на экран, чтобы щелкнуть что-то, панель выбора появится ненадолго и исчезнет.
Следовательно, setSelection()
будет иметь только визуальное воздействие, если активность не находится в режиме касания (т.е. последнее, что сделал пользователь, это использовать D-pad/trackball).
Я не на 100% уверен, что это объясняет ваше явление, учитывая приведенное вами описание, но я подумал, что это стоит того...
Если вы используете адаптер для своего списка, добавьте этот код в свой адаптер:
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);
Может быть, вы должны использовать метод smoothScrollToPosition (int position) ListView
Для меня вызов
listView.notifyDataSetChanged();
listView.requestFocusFromTouch();
а затем
listView.setSelection(position);
решил проблему.
если вы делаете это в runnable, он работает без вызова requestFocusFromTouch(), но старая позиция ListView отображается для sekound.
У меня очень большой запрос с 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;)
В моем случае работала функция smoothScrollToPosition (int position), можете ли вы также рассказать мне, как установить эту прокрученную позицию в центр списка. Он появился в нижней части видимых предметов.
Для меня это помогло установить
ListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
или ListView.CHOICE_MODE_MULTIPLE
затем ListView.setSelection(position)
или ListView.setItemChecked(position, true);
отлично работает
Нашел решение в моем случае. Я не использую Runnable, так как мой класс расширяет ListFragment. Мне нужно было сделать мой индекс последним; конечный индекс = 5; mListView.setSelection(индекс);
Я обнаружил, что иногда setSelection не работает, потому что я устанавливаю атрибут "android: height" listView в "wrap_content".
И времена, когда мое приложение не будет работать, это то, что когда listView становится прокручиваемым из незапрограммируемого.
Например, если мое приложение "Приложение для браузера файлов". Когда мой список меньше, скажем, 6, то он не прокручивается. Теперь я возвращаюсь в родительский каталог и имеет 11 объектов, и я хочу установить выделение в какую-то позицию, и он не будет работать здесь.
to\from | Scrollable | non-Scrollable
Прокручиваемый | O | O (конечно)
не прокручиваемый | X | O (конечно)
Я не хочу использовать post (Runnable), потому что будет задержка.
==================================
Ответ:
Вы можете попробовать установить "android: height" в "match_parent"
Бог, он проводит три дня.При использовании сообщения setSelection()
сначала будет отображаться ListView
, затем прокрутите до позиции, благодаря " 魏經軒", тогда макет фактически произведет эффект setSelection()
, потому что setSelection()
вызовите setSelectionFromTop(int position, int y)
, есть другой способ его решить.
listView.setAdapter(listView.getAdapter());
listView.setSelection(123);
Просто попробуйте этот код
listView.setAdapter(adapter);
listView.setSelection(position);
adapter.notifyDataSetChanged();
Для меня решение этой проблемы:
listView.clearChoices();