Заставить элемент ListView оставаться «нажатым» после нажатия? - PullRequest
21 голосов
/ 01 февраля 2011

У меня есть ListView, который открывает другое действие при щелчке строки элемента с помощью прослушивателя onItemClick.

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

Я попытался установить view.setPressed (true) в слушателе onItemClick (), но, похоже, он вызывается через мгновение после того, как состояние печати вернулось в нормальное состояние, поскольку оно слегка мигает.

Например:

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, чтобы определить нормальное, нажатое, выделенное и т. Д. Состояния для фона списка.

Ответы [ 7 ]

26 голосов
/ 29 сентября 2011

У меня была та же самая проблема к большому разочарованию!

Однако его легко решить, заменив 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
}
6 голосов
/ 08 февраля 2011

Лучший способ сделать это до Android 3.0 - это использовать пользовательское состояние в пользовательском представлении или изменить цвет фона вашего представления из адаптера.Начиная с Android 3.0, вы можете использовать новый state_activated, чтобы сохранить выбранный элемент списка.

3 голосов
/ 14 марта 2012

Внутри Адаптера вы можете ссылаться на представление, для которого вы хотите изменить состояние.Скажем, у вас есть 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 должен ссылаться на рисование, как это:

<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>
2 голосов
/ 07 февраля 2011

Вы используете XML для селектора. проверьте, правильно ли вы указали состояние.
Пока вы устанавливаете view.setPressed(true), он будет использовать отрисовку, установленную для состояния android:state_pressed="true", например

<item android:state_pressed="true"   
    android:drawable="@color/gray" />
0 голосов
/ 08 февраля 2011

Не используйте селектор XML. Вместо этого измените изображения элементов списка вручную. Таким образом, вы сможете контролировать продолжительность определенного изображения

0 голосов
/ 06 февраля 2011

В этом примере фон меняется после нажатия кнопки в элементе списка. http://androidforbeginners.blogspot.com/2010/03/clicking-buttons-in-listview-row.html

Вы можете сделать аналогичную вещь в onItemSelected (), манипулируя View, который был передан этому вызову. Обычно переданное представление является LinearLayout, которое содержит дочерние представления, такие как textView.

0 голосов
/ 06 февраля 2011

Вы уже пытались использовать unscheduleDrawable в сочетании с drawableStateChanged

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

Может быть, больше не мерцает.

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