Если вы заморозили макет после установки адаптера, он больше не глотает щелчки:
recyclerView.isLayoutFrozen = true // kotlin
recyclerView.setLayoutFrozen(true); // java
Просто имейте в виду, что если вам нужно изменить данные в адаптере, вы должны разморозить макет. перед вызовом notifyDataSetChanged, а затем повторно заморозить макет. Я не люблю это решение, но оно единственное, которое сработало для меня.
Поможет ли здесь динамическая библиотека linq ? В частности, я думаю как предложение Где
. Если необходимо, поместите его в список / массив просто для вызова . Где (строка)
на нем! то есть
var people = new List<Person> { person };
int match = people.Where(filter).Any();
Если нет, то написание парсера (с использованием выражения
под капотом) не очень обременительно - я написал одно подобное (хотя я не думаю, что у меня есть источник) в моем поезде, просто до Рождества ...
Вы можете взглянуть на DLR . Это позволяет вам оценивать и выполнять скрипты внутри приложения .NET 2.0. Вот пример с IronRuby :
using System;
using IronRuby;
using IronRuby.Runtime;
using Microsoft.Scripting.Hosting;
class App
{
static void Main()
{
var setup = new ScriptRuntimeSetup();
setup.LanguageSetups.Add(
new LanguageSetup(
typeof(RubyContext).AssemblyQualifiedName,
"IronRuby",
new[] { "IronRuby" },
new[] { ".rb" }
)
);
var runtime = new ScriptRuntime(setup);
var engine = runtime.GetEngine("IronRuby");
var ec = Ruby.GetExecutionContext(runtime);
ec.DefineGlobalVariable("bob", new Person
{
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = "1/1/2000"
});
var eval = engine.Execute<bool>(
"return ($bob.Age > 3 && $bob.Weight > 50) || $bob.Age < 3"
);
Console.WriteLine(eval);
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public int Weight { get; set; }
public string FavouriteDay { get; set; }
}
Конечно, этот метод основан на оценке во время выполнения, и код не может быть проверен во время компиляции.
Еще одна такая библиотека - Flee
Я провел быстрое сравнение Dynamic Linq Library и Flee и Фли был в 10 раз быстрее для выражения "(Имя == \" Йохан \ "И зарплата> 500) ИЛИ (Имя! = \" Йохан \ "И зарплата> 300)"
Вот как вы можете написать свой код, используя Flee.
static void Main(string[] args)
{
var context = new ExpressionContext();
const string exp = @"(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3";
context.Variables.DefineVariable("Person", typeof(Person));
var e = context.CompileDynamic(exp);
var bob = new Person
{
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = new DateTime(2000, 1, 1)
};
context.Variables["Person"] = bob;
var result = e.Evaluate();
Console.WriteLine(result);
Console.ReadKey();
}