【问题标题】:AddTextChangedListener in mono for androidandroid 单声道中的 AddTextChangedListener
【发布时间】:2012-12-19 08:41:22
【问题描述】:

我有一个用于填充列表视图的数据库。在此列表视图上方有一个编辑文本,用户在其中搜索列表视图中的项目。根据输入,我希望对列表视图进行细化和过滤,以仅包含与输入相似的项目。这在 java 中很简单,但在 xamarin 的单声道中很难。这是我的 onCreate() 方法,数据库填充列表视图。

string[] categories;
protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);
    SetContentView(Resource.Layout.b);
    var destPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "DDxDDB"); 
    System.IO.Stream source = Assets.Open("DDxDDB");
    var dest = System.IO.File.Create (destPath);
    source.CopyTo (dest); 
    var sql = "SELECT _id FROM Sx;";
    var conn = new SqliteConnection ("Data Source=" + destPath.ToString());
    conn.Open ();
    var cmd = conn.CreateCommand ();
    cmd.CommandText = sql;
    SqliteDataReader reader = cmd.ExecuteReader ();
    List<string> categ = new List<string>();
    while (reader.Read()) 
    {
        categ.Add(reader.GetString(0));
    }
    categories = categ.ToArray();
    ArrayAdapter<string> dataAdapter = new ArrayAdapter<String>(this, Resource.Layout.Main, categories);
    ListView listView = (ListView) FindViewById(Resource.Id.listView1);
    listView.Adapter = dataAdapter; 
    listView.TextFilterEnabled = true;
    EditText myFilter = (EditText)FindViewById(Resource.Id.myFilter);
    myFilter.AddTextChangedListener(New MyTextWatcher);    
}

这是我也包含在此活动中的类,但我不知道要在方法中添加什么代码来过滤列表视图。

public class MyTextWatcher: Java.Lang.Object, ITextWatcher
{
    public void AfterTextChanged(IEditable s) {}
    public void BeforeTextChanged(Java.Lang.ICharSequence arg0, int start, int count, int after) {}
    public void OnTextChanged(Java.Lang.ICharSequence arg0, int start, int before, int count) {}
}

【问题讨论】:

  • 您是如何在 Android 中进行的?也许发布你在那里所做的等效代码,然后我会更容易快速指导你如何在 Mono for Android 上做。
  • 这是我一直在使用的示例。我的困难是方法可以在java中的其他方法中定义,但不能在c#中定义。 stackoverflow.com/questions/5311032/filter-text-from-listview

标签: listview xamarin.android filtering textchanged


【解决方案1】:

正如 aaronmix 所说,EditText 具有三个事件,您可以使用它们而不必实现 ITextWatcher 类。

因此您可以将EventHandler 附加到AfterTextChanged 并从Event 的参数中获取Editable

var editText = FindViewById<EditText>(Resource.Id.MyEditText);
editText.AfterTextChanged += (sender, args) =>
{
    //do your stuff in here
    //args.Editable is the equivalent of the `s` argument from Java
    //afterTextChanged(Editable s)
};

【讨论】:

    【解决方案2】:

    在 Mono for Android 的实现中,EditText 已经拥有三个事件 TextChangedAfterTextChangedBeforeTextChanged,因此您只需为每个事件添加委托即可。

    【讨论】:

      【解决方案3】:

      是的,感谢你们俩的帮助。我正在做类似的事情,而且效果很好。这里是:

      string[] categories;
      
      protected override void OnCreate (Bundle bundle)
      {
          base.OnCreate (bundle);
          SetContentView(Resource.Layout.b);
          var destPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "DDxDDB"); 
          System.IO.Stream source = Assets.Open("DDxDDB");
          var dest = System.IO.File.Create (destPath);
          source.CopyTo (dest); 
          var sql = "SELECT _id FROM Sx;";
          var conn = new SqliteConnection ("Data Source=" + destPath.ToString());
          conn.Open ();
          var cmd = conn.CreateCommand ();
          cmd.CommandText = sql;
          SqliteDataReader reader = cmd.ExecuteReader ();
          List<string> categ = new List<string>();
          while (reader.Read()) 
          {
              categ.Add(reader.GetString(0));
          }
          categories = categ.ToArray();
          ArrayAdapter<string> dataAdapter = new ArrayAdapter<String>(this, Resource.Layout.Main, categories);
          ListView listView = (ListView) FindViewById(Resource.Id.listView1);
          listView.Adapter = dataAdapter; 
          listView.TextFilterEnabled = true;
          EditText myFilter = (EditText)FindViewById(Resource.Id.myFilter);
          myFilter.TextChanged += new EventHandler<TextChangedEventArgs>(OnTextChange);
      }
      
      public void OnTextChange(object sender, EventArgs e)
      {           
          EditText myFilter = (EditText)FindViewById(Resource.Id.myFilter);
          string val = myFilter.Text.ToString();
          List<string> categ2 = new List<string>();
          foreach (string value in categories) 
          {
              if (value.IndexOf(val, StringComparison.CurrentCultureIgnoreCase) != -1)
              {
                  categ2.Add(value);
              }
          }
          string[] categories2 = categ2.ToArray();
          ArrayAdapter<string> dataAdapter = new ArrayAdapter<String>(this, Resource.Layout.Main, categories2);
          ListView listView = (ListView) FindViewById(Resource.Id.listView1);
          listView.Adapter = dataAdapter; 
          listView.TextFilterEnabled = true;
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 2013-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-29
        • 1970-01-01
        相关资源
        最近更新 更多