如何在Xamarin.Forms的Android平台上禁用ListView中的选中高亮显示

10
我使用 Xamarin.Forms 创建了 ListView,我正在寻找一种方法,在轻按 ListView 时不突出显示 ViewCell。 请查看下面的图片。 感谢您提前 :)
7个回答

8
在您的 ListView 的 SelectedItem 事件处理程序中,您可以这样做:
listview.SelectedItem = null;

这将给你点击高亮效果,但状态仅是短暂的。

我猜你会喜欢这个,因为你在右侧使用了两个 Image 来代替 Button,并使用了 TapGestureRecognizer。你知道吗?Button 有一个 Image 属性。当在 Cell 中点击 Button 时,不应更改 Cell 的选中状态。


1
当我点击图像时,它不会改变列表视图的状态。只有当我误点列表中除图像以外的其他部分时,它才会改变,这看起来很奇怪。我尝试了你的解决方案,但它没有起作用...我改变了视图单元的背景颜色,这解决了问题.. :) 感谢你的帮助.. :) 我之前不知道按钮有图像属性,也感谢你提供了这个信息。 - Femil Shajin
1
ItemSelected 不可为空。 - Alexandre
2
你的意思是 .SelectedItem 吗?ItemSelected 是事件。SelectedItem 是属性。 - MemeDeveloper
2
listview.SelectedItem = null; - Ajay Kumar

7

只需将以下内容放入自定义主题中:

<item name="android:colorActivatedHighlight">@android:color/transparent</item>

2
谢谢。它有效。在Droid项目中添加此行的默认文件位于Resouces/values/styles.xml中。 - eka808
这个很好用... 我也想在 Android 项目中实现它... - Ifeoluwa Osungade

7

我希望能够分享另一种我非常喜欢的解决方案,因为它很简单,您只需要实现一次并且在XAML中使用起来非常容易。

首先,我们必须实现自己的行为。这相当简单:

public class DeselectItemBehavior : Behavior<ListView>
{
    protected override void OnAttachedTo(ListView bindable)
    {
        base.OnAttachedTo(bindable);

        bindable.ItemSelected += ListView_ItemSelected;
    }

    protected override void OnDetachingFrom(ListView bindable)
    {
        base.OnDetachingFrom(bindable);

        bindable.ItemSelected -= ListView_ItemSelected;
    }

    private void ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        ((ListView)sender).SelectedItem = null;
    }
}

当行为设置时,我们只需注册事件,当取消设置时则注销事件。该事件本身采用了Stephane Delcroix的方法。现在在ListView中添加行为的所有操作都是这样的:
<ListView ...>
    <ListView.Behaviors>
        <behaviors:DeselectItemBehavior />
    </ListView.Behaviors>

5
我使用了Xamarin.Forms中的ListView SelectionMode = "None"

这个应该是被接受的答案(这是最简单和最新的解决方案) - Zoli
1
这将停用SelectionChanged功能。 - Ifeoluwa Osungade

2

针对在Android和iOS中禁用Listview单元格选择高亮的问题,这个链接非常有帮助。

https://gist.github.com/jessejiang0214/63b29b3166330c6fc083

在ProjectName.Android/Resources/values/styles.xml文件中进行设置。

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <style name="CustomTheme" parent="android:Theme.Holo.Light">
        <item name="android:colorActivatedHighlight">@android:color/transparent</item>
    </style>
</resources>

CustomAllViewCellRendereriOS.cs

using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer (typeof(ViewCell), typeof(MyAPP.iOS.CustomAllViewCellRendereriOS))]
namespace MyAPP.iOS
{
    public class CustomAllViewCellRendereriOS : ViewCellRenderer
    {
        public override UIKit.UITableViewCell GetCell (Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv)
        {
            var cell =  base.GetCell (item, reusableCell, tv);
            if (cell != null)
                cell.SelectionStyle = UIKit.UITableViewCellSelectionStyle.None;
            return cell;
        }
    }
}
最初的回答似乎是正确且最佳的方式...!

这似乎是正确且最佳的方式...!


1

我想给你建议另一种解决方法。你可以添加:

IsEnabled="False"

在您的listview小部件中。 在我的情况下,这个解决方案很有效。


谢谢。对我非常有效! - Max
2
@TeoVr81 这将禁用列表上的所有事件,而不仅仅是选择事件,例如您将无法滚动。 - Scarnet

1
您无法这样做,您需要实现自定义渲染。如果您只是将所选项目设置为null,它将删除所选颜色。但是您将首先选择该项目,然后再次取消选择(多个事件),但您没有看到它:-)。如果在Windows Phone上启用了倾斜效果,则由于所有事件,倾斜仍会发生!但我希望看到Xamarin Forms团队在列表视图上实现CanSelect属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,