Заставить элемент ListView оставаться нажатым после нажатия?
У меня есть ListView, который открывает другое действие при щелчке по строке элемента через прослушиватель onItemClick.
Я бы хотел, чтобы эта строка оставалась в нажатом состоянии с момента нажатия на экран, когда экран переключается на новое действие. Я думаю, что это будет более понятным для пользователя, и вы увидите такие вещи с большинством кнопок, которые открывают/закрывают диалоги или переключают действия.
Я попробовал установить view.setPressed(true) в onItemClick() listener, но, похоже, он вызван через мгновение после того, как состояние нажатия изменилось на нормальное, поскольку оно слегка мерцает.
Например:
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
view.setPressed(true);
//start an activity
}
});
Этот код почти работает, за исключением мерцания (Пользователь нажимает элемент списка и переходит в его нажатое состояние, затем пользователь отпускает (завершает щелчок), и он возвращается к своему нормальному состоянию в течение секунды секунды, прежде чем возвращаться к нажатое состояние из вызова setPressed (true))
Любые идеи?
Спасибо
Изменить: я должен упомянуть, что я использую селектор с возможностью xml для определения нормальных, нажатых, выбранных и т.д. состояний для фона списка.
Ответы
Ответ 1
У меня была одна и та же проблема, к большому разочарованию!
Однако это легко решить, заменив state_pressed
на state_selected
. Нажатое состояние будет по-прежнему быстро изменяться до вызова onItemClick()
, но поскольку ваша тема не зависит от state_pressed
, мерцание не будет видно. После onItemClick()
вы установите state_selected
, и элемент останется выбранным без каких-либо мерцаний.
Здесь мой селектор:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Selected Item -->
<item android:state_selected="true"
android:drawable="@color/list_pressed" />
<!-- Default Item -->
<item android:state_selected="false"
android:drawable="@android:color/list_default" />
</selector>
И мой onListItemClick (...):
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
v.setSelected(true);
//TODO: add further actions here
}
Ответ 2
Лучший способ сделать это до того, как Android 3.0 будет использовать настраиваемое состояние в пользовательском представлении или изменить цвет фона представления с адаптера. Начиная с Android 3.0 вы можете использовать новый state_activated
, чтобы сохранить выбранный элемент списка.
Ответ 3
Изнутри адаптера вы можете ссылаться на представление, в котором вы хотите изменить состояние. Скажем, у вас есть ListView с названием и звездой (т.е. Любимая звезда), и вы хотите, чтобы это было "выбрано/нажато" при касании. Переопределите getView и сделайте что-то вроде:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final ImageButton favorite = (ImageButton) view.findViewById(R.id.favorite);
favorite.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Star pressed...");
v.setSelected(!v.isSelected());
}
});
return view;
}
И ваш макет ImageButton должен ссылаться на drawable следующим образом:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@android:drawable/star_big_on" />
<item android:state_pressed="true" android:drawable="@android:drawable/star_big_on" />
<item android:drawable="@android:drawable/star_big_off" />
</selector>
Ответ 4
Вы используете xml для селектора. проверьте, правильно ли вы указали состояние.
Пока вы устанавливаете view.setPressed(true)
, он будет использовать drawable, который установлен для состояния android:state_pressed="true"
, как
<item android:state_pressed="true"
android:drawable="@color/gray" />
Ответ 5
Вы уже пытались использовать unscheduleDrawable в сочетании с drawableStateChanged
Таким образом, вы могли бы слушать, изменилось ли состояние, а затем сразу же отменили расписание и вернули его обратно.
Возможно, больше не мерцает.
Ответ 6
В этом примере фон изменяется после нажатия кнопки в элементе списка.
http://androidforbeginners.blogspot.com/2010/03/clicking-buttons-in-listview-row.html
Вы можете сделать подобное в onItemSelected(), манипулируя View, который был передан этому вызову. Обычно просматриваемый вид представляет собой LinearLayout, который содержит представления детей, такие как textView.
Ответ 7
Не используйте XML-селектор. Вместо этого измените изображения элементов списка вручную. Таким образом, вы сможете контролировать длительность определенного изображения