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

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

4b9b3361

Ответ 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-селектор. Вместо этого измените изображения элементов списка вручную. Таким образом, вы сможете контролировать длительность определенного изображения