2016-02-23 12 views
23

Mam ListView z niestandardową ViewCell, która wyświetla artykuły. Jednak po wybraniu elementu wyświetlany jest efekt marszczenia/selekcji materiału.Xamarin.Forms untappable ListView (usuwanie efektu ripple wyboru)

Ripple effect

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> 

Jak mogę usunąć efekt fali?

Aktualizacja:

Po wykonaniu niektórych badań znalazłem RepeaterView w bibliotece XLabs. Działa to, jeśli zawiniesz go w ScrollView, chociaż zabiera on wiele schludnych mechanizmów ListView, takich jak odświeżanie. Nie obsługuje również zmian w ItemSource z zewnętrznego wątku. Nadal szukam innych rozwiązań, ponieważ wiem, że jest to możliwe w natywnym systemie Android.

Odpowiedz

15

Po długim, długim czasie zorientowaliśmy się, że można to osiągnąć za pomocą niestandardowego renderera. Oto, jak, najpierw, stwórz plik o nazwie no_selector.xml i umieść go w folderze Resources/layouts (właściwości opakowania muszą być ustawione na 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> 

Potem utworzyć niestandardowy mechanizm renderujący dla komponentu 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); 
     } 
    } 
} 

Jeśli plik no_selector nie można znaleźć odbudować swój projekt!

Należy pamiętać, że powoduje to usunięcie tętnienia dla wszystkich ListViews w aplikacji. Jeśli chcesz, aby był kierowany tylko na parę, możesz zmienić pierwszy typ atrybutu ExportRenderer (wymaga to utworzenia oddzielnej klasy, która rozszerza ListView).

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

+0

Próbowaliśmy zrobić to dokładnie tak, ale otrzymujemy wyjątek NotFoundException. Odbudowujemy i czyścimy to rozwiązanie wiele razy.Funkcja BuildAction jest ustawiona na AndroidResources i możemy zobaczyć plik xml w wygenerowanym pakiecie APK – Chris

1

myślę, że można go usunąć bez niestandardowy mechanizm renderujący.

Możesz ustawić BackgroundColor swojego StackPanel na szary lub bez względu na kolor tła twojej listy lub strony.

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

Albo można użyć android style zmianie widoku listy stylów:

Set tematem AndroidManifest.xml

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

Tworzenie tematem 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> 
Powiązane problemy