2011-04-23 69 views
8

我的Activity中有一个MultiAutoCompleteTextView小部件,其中有一个ArrayAdapter<String>,它由来自基于Web的调用的结果填充。当用户在文本视图中键入字符时,该适配器的列表应该在后台更新。什么是实施这个最好的方法?带动态适配器更改的MultiAutoCompleteTextView

我已经尝试使用AsyncTask在后台下载字符串列表,但notifyDataSetChanged()正在从“非始发线程”调用。而且,这似乎有点迂回。

我遇到的另一个选择是Filterable可以使用,但我没有遇到任何简单的例子(AutoComplete4看起来像一个矫枉过正)如何做到这一点。如果没有例子,有人可以给我一个我将需要的演员的广泛概述 - 过滤器,Filterable等。

也是这是一个好方法吗?

感谢,
Rajath

+0

你有任何解决方案 – user1767260 2013-09-30 10:03:17

+0

@ user1767260,它已经两年多了我发布了这些问题;我不认为我追求这一点。 – rajath 2013-09-30 10:50:12

回答

0

我知道这个问题是旧的,但我不得不这样做同样的事情,我想我会与大家分享的解决方案或任何需要它。

首先,您确实需要使用AsyncTask来检索您的数据。这就是说,我绝不会让AsyncTask以任何方式操作我的视图类。相反,我宁愿使用一个回调与您的AsyncTask中需要的参数一起传递。一旦AsyncTask完成,您将调用您的回调方法,该方法将负责调用notifyDataSetChanged()

下面是一些代码:

MyAsyncTask.java

public class MyAsyncTask extends AsyncTask<Object, Void, Object> { 

@Override 
protected String doInBackground(Object... params) { 
    MyController callbackClass = (MyController) params[0]; 

    // Get your other parameters and do your stuff here... 

    // Call the setter with the data you get back and refresh the view 
    // either here or implementing onPostExecute. 
    callbackClass.setMyData(myData); 
    callbackClass.refreshView(); 

    // Return any object if you need. 
    return null; 
} 
} 

MyCallbackClass.java

public MyCallbackClass extends Fragment{ 

    private List<MyDataType> myData; 

    private ArrayAdapter<MyDataType> myAdapter; 

    // Your methods including setters and getters. 

    public void refreshFriendList(){ 
    if(myAdapter == null){ 
     initAutoCompleteView(); 
    } 
    myAdapter.clear(); 
    myAdapter.addAll(myData); 
    myAdapter.notifyDataSetChanged(); 
    } 

}