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

Xamarin.Forms untappable ListView (удалить эффект пульсации выбора)

У меня есть ListView с настраиваемым ViewCell, который отображает статьи. Однако, когда вы выбираете элемент, он показывает эффект пульсации/выбора материала.

Эффект пульсации

Xaml:

   <ListView HasUnevenRows="True" ItemsSource="{Binding NewsArticles}" IsPullToRefreshEnabled="True">
        <ListView.ItemTemplate>
          <DataTemplate>
            <ViewCell>
              <StackLayout Padding="10">
                <Label Text="{Binding Title}" HorizontalOptions="Center" FontAttributes="Bold" />
                <Image Source="{Binding ImageUrl}" IsVisible="{Binding HasImage}" />
                <Label Text="{Binding Content}"></Label>
              </StackLayout>
            </ViewCell>
          </DataTemplate>
        </ListView.ItemTemplate>
      </ListView>

Как удалить эффект пульсации?

Update:

После некоторых исследований я нашел RepeaterView в библиотеке XLabs. Это работает, если вы оберните его в ScrollView, хотя он отнимает много аккуратной механики ListView, такой как обновление. Он также не поддерживает изменения ItemSource из внешнего потока. Все еще ищу другие решения, поскольку я знаю, что это возможно на родном Android.

4b9b3361

Ответ 1

Итак, после долгого, долгого времени мы это выяснили, вы можете выполнить его с помощью специального средства визуализации. Вот как,

Сначала создайте файл no_selector.xml и поместите его в папку Ресурсы/макеты (свойства упаковки должны быть установлены на AndroidResource).

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_window_focused="false" android:drawable="@android:color/transparent"/>
</selector>

После этого создайте собственный визуализатор для компонента ListView,

[assembly: ExportRenderer (typeof(ListView), typeof(NoRippleListViewRenderer))]
namespace Your.Own.Namespace
{
    public class NoRippleListViewRenderer : ListViewRenderer
    {
        protected override void OnElementChanged (ElementChangedEventArgs<ListView> e)
        {
            base.OnElementChanged (e);
            Control.SetSelector (Resource.Layout.no_selector);
        }
    }
}

Если файл no_selector не найден, перестройте свой проект!

Помните, что это устраняет пульсацию для all ListViews в вашем приложении. Если вы хотите, чтобы он нацелился на пару, вы можете изменить первый тип в атрибуте ExportRenderer (это требует от вас создания отдельного класса, который расширяет ListView).

https://gist.github.com/awatertrevi/d83787dbbf3de6ef0e0a344169d3c2fa

Ответ 2

Я думаю, вы можете удалить его без специального рендеринга.

Вы можете установить BackgroundColor вашего StackPanel на серый или любой другой цвет фона вашего списка или страницы.

<ListView HasUnevenRows="True" ItemsSource="{Binding NewsArticles}" IsPullToRefreshEnabled="True">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout Padding="10" BackgroundColor="Gray">
                    <!-- ... --> 
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Или вы можете использовать стили Android для изменения стилей вида списка:

Установить тему в AndroidManifest.xml

<application android:label="$safeprojectname$" android:theme="@style/myTheme"></application>

Создать тему в styles.xml

<?xml version="1.0" encoding="utf-8" ?>
<resources>
    <style name="myTheme" parent="@android:style/Theme.Material.Light">
        <item name="android:listViewStyle">@style/ListViewStyle.Light</item>
    </style>

    <style name="ListViewStyle.Light" parent="@android:style/Widget.ListView">
        <item name="android:listSelector">@android:color/transparent</item>
    </style>
</resources>