For my AutoCompleteTextView
我需要从网络服务获取数据。由于这可能需要一点时间,我不希望 UI 线程没有响应,因此我需要以某种方式在单独的线程中获取数据。例如,从 SQLite DB 获取数据时,使用以下命令非常容易完成CursorAdapter
方法 -runQueryOnBackgroundThread
。我正在寻找其他适配器,例如ArrayAdapter
, BaseAdapter
,但找不到类似的东西...
有没有一种简单的方法可以实现这一目标?我不能简单地使用ArrayAdapter
直接,因为建议列表是动态的 - 我总是根据用户输入获取建议列表,因此无法预取和缓存它以供进一步使用...
如果有人可以就这个主题提供一些提示或示例 - 那就太好了!
通过上述方法,我在快速打字时也遇到了这些问题。我猜这是因为结果的过滤是由过滤器类异步完成的,所以在过滤完成时修改 ui 线程中的 Adapter 的 ArrayList 时可能会出现问题。
http://developer.android.com/reference/android/widget/Filter.html http://developer.android.com/reference/android/widget/Filter.html
然而,通过以下方法一切正常。
public class MyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MyAdapter myAdapter = new MyAdapter(this, android.R.layout.simple_dropdown_item_1line);
AutoCompleteTextView acTextView = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
acTextView.setAdapter(myAdapter);
}
}
public class MyAdapter extends ArrayAdapter<MyObject> {
private Filter mFilter;
private List<MyObject> mSubData = new ArrayList<MyObject>();
static int counter=0;
public MyAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
setNotifyOnChange(false);
mFilter = new Filter() {
private int c = ++counter;
private List<MyObject> mData = new ArrayList<MyObject>();
@Override
protected FilterResults performFiltering(CharSequence constraint) {
// This method is called in a worker thread
mData.clear();
FilterResults filterResults = new FilterResults();
if(constraint != null) {
try {
// Here is the method (synchronous) that fetches the data
// from the server
URL url = new URL("...");
URLConnection conn = url.openConnection();
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
while ((line = rd.readLine()) != null) {
mData.add(new MyObject(line));
}
}
catch(Exception e) {
}
filterResults.values = mData;
filterResults.count = mData.size();
}
return filterResults;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
if(c == counter) {
mSubData.clear();
if(results != null && results.count > 0) {
ArrayList<MyObject> objects = (ArrayList<MyObject>)results.values;
for (MyObject v : objects)
mSubData.add(v);
notifyDataSetChanged();
}
else {
notifyDataSetInvalidated();
}
}
}
};
}
@Override
public int getCount() {
return mSubData.size();
}
@Override
public MyObject getItem(int index) {
return mSubData.get(index);
}
@Override
public Filter getFilter() {
return mFilter;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)