2

リストビューにデータを入力するために使用しているデータベースがあります。このリストビューの上には、ユーザーがリストビューでアイテムを検索する編集テキストがあります。入力に基づいて、入力に類似しているアイテムのみが含まれるようにリストビューを調整およびフィルタリングする必要があります。これはJavaでは簡単ですが、xamarinによるAndroidのモノでは困難です。これが私の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) {}
}
4

3 に答える 3

6

aaronmix が言うように、クラスEditTextを実装する代わりに使用できる 3 つのイベントがあります。ITextWatcher

したがって、 の引数に をアタッチして、EventHandlerからAfterTextChangedを取得できます。EditableEvent

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)
};
于 2012-12-19T23:29:25.947 に答える
2

Mono for Androidの実装では、EditTextすでに3つのイベントTextChangedとがAfterTextChangedありBeforeTextChangedます。そのため、それぞれにデリゲートを追加するだけです。

于 2012-12-19T18:07:56.797 に答える
0

はい、助けてくれてありがとう。私はそれに似たようなことをしており、うまく機能しています。ここにあります:

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;
} 
于 2012-12-20T00:37:22.573 に答える