Android AutoCompleteTextView自定义下拉菜单,包含来自Web的数据
我让AutoCompleteTextView使用默认下拉列表。我现在正试图弄清楚我是否可以使用自定义下拉列表来处理我的数据。我感觉很接近,但我无法显示下拉列表。 这就是我要做的 我创建了一个自定义适配器Android AutoCompleteTextView自定义下拉菜单,包含来自Web的数据,android,autocompletetextview,Android,Autocompletetextview,我让AutoCompleteTextView使用默认下拉列表。我现在正试图弄清楚我是否可以使用自定义下拉列表来处理我的数据。我感觉很接近,但我无法显示下拉列表。 这就是我要做的 我创建了一个自定义适配器 public class UserSearchAdapter extends ArrayAdapter<UserSearchItem> { private Context context; private LayoutInflater vi; int count = 0; pub
public class UserSearchAdapter extends ArrayAdapter<UserSearchItem> {
private Context context;
private LayoutInflater vi;
int count = 0;
public UserSearchAdapter(Context context) {
super(context, 0, items);
this.context = context;
vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
final UserSearchItem i = items.get(position);
if (i != null) {
Log.d("adapter", "in here");
UserSearchItem si = (UserSearchItem) i;
v = vi.inflate(R.layout.user_search_item, null);
final TextView title = (TextView) v
.findViewById(R.id.tv_userSearchName);
if (title != null)
title.setText(si.userName);
}
return v;
}
这里是我实现AutoCompleteTextView的地方
userSearch = (AutoCompleteTextView)findViewById(R.id.tv_UserSearch);
AutoCompleteAdapter = new UserSearchAdapter(this);
userSearch.setAdapter(AutoCompleteAdapter);
userSearch.addTextChangedListener(this);
@Override
public void afterTextChanged(Editable s) {
if (shouldAutoComplete) {
new DoAutoCompleteSearch().execute(s.toString());
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
shouldAutoComplete = true;
for (int position = 0; position < AutoCompleteAdapter.getCount(); position++) {
if (AutoCompleteAdapter.getItem(position).userName.equalsIgnoreCase(s.toString())) {
shouldAutoComplete = false;
break;
}
}
}
private class DoAutoCompleteSearch extends AsyncTask<String, Void, ArrayList<UserSearchItem>> {
@Override
protected ArrayList<UserSearchItem> doInBackground(String... params) {
ArrayList<UserSearchItem> autoComplete = new ArrayList<UserSearchItem>();
//get info from DB (userName, userId, userFbId)
UserSearchItem item = new UserSearchItem(userName, userId, userFbId);
autoComplete.add(item);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return autoComplete;
}
@Override
protected void onPostExecute(ArrayList<UserSearchItem> result) {
AutoCompleteAdapter.clear();
for (UserSearchItem s : result)
{
AutoCompleteAdapter.add(s);
}
}
}
userSearch=(AutoCompleteTextView)findviewbyd(R.id.tv\u userSearch);
AutoCompleteAdapter=新的UserSearchAdapter(此);
setAdapter(自动完成适配器);
userSearch.addTextChangedListener(此);
@凌驾
公共无效后文本已更改(可编辑){
如果(应自动完成){
新的DoAutoCompleteSearch().execute(s.toString());
}
}
@凌驾
更改前的公共void(字符序列arg0、int arg1、int arg2、,
int arg3){
//TODO自动生成的方法存根
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
shouldAutoComplete=true;
对于(int position=0;position
有什么建议吗?如果您仍在寻找答案,请使用构造函数中的数据填充适配器:
UserSearchAdapter adapter = new UserSearchAdapter(this, data);
并在适配器类中添加一个构造函数,如下所示:
public class UserSearchAdapter extends ArrayAdapter<UserSearchItem> {
private Context context;
private LayoutInflater vi;
int count = 0;
private List<UserSearchItem> mItems;
public UserSearchAdapter(Context context) {
super(context, 0, items);
this.context = context;
vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public UserSearchAdapter(Context context, List<UserSearchItem> items) {
super(context, 0, items);
this.context = context;
vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mItems = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
final UserSearchItem i = mItems.get(position);
if (i != null) {
Log.d("adapter", "in here");
UserSearchItem si = (UserSearchItem) i;
v = vi.inflate(R.layout.user_search_item, null);
final TextView title = (TextView) v
.findViewById(R.id.tv_userSearchName);
if (title != null)
title.setText(si.userName);
}
return v;
}
公共类UserSearchAdapter扩展了ArrayAdapter{
私人语境;
私人停车场6号;
整数计数=0;
私人名单;
公共UserSearchAdapter(上下文){
超级(上下文,0,项);
this.context=上下文;
vi=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
}
公共UserSearchAdapter(上下文、列表项){
超级(上下文,0,项);
this.context=上下文;
vi=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
mItems=项目;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
最终用户搜索项i=mItems.get(位置);
如果(i!=null){
Log.d(“适配器”,“在这里”);
UserSearchItem si=(UserSearchItem)i;
v=vi.充气(R.layout.user\u search\u item,null);
最终文本视图标题=(文本视图)v
.findViewById(R.id.tv\u用户名);
如果(标题!=null)
title.setText(si.userName);
}
返回v;
}
##初始化##
AutocompleteTextview actv=(AutocompleteTextview)view.findViewById(R.id.etSearchPlace);
##在适配器中设置web API的列表响应##
SpringArrayAdapter SpinnerayAdapter=新的CustomAdapter(mcontext,android.R.layout.simple\u spinner\u项,名称列表);
##将适配器设置为自动完成文本视图##
actv.setAdapter(SpinneArrayaAdapter);
##在自定义适配器中设置下拉布局##
公共类CustomAdapter扩展了ArrayAdapter{
公共CustomAdapter(上下文上下文,int textViewResourceId,
列出对象){
超级(上下文、textViewResourceId、对象);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=super.getView(位置、转换视图、父级);
如果(查看文本视图的实例){
((文本视图)视图).setTextSize(15);
((TextView)视图).setTransformationMethod(null);
Typeface-Typeface=ResourcesCompat.getFont(parent.getContext(),R.font.montesemibold);
((文本视图)视图)。设置字体(字体);
}
返回视图;
}
}
public class UserSearchAdapter extends ArrayAdapter<UserSearchItem> {
private Context context;
private LayoutInflater vi;
int count = 0;
private List<UserSearchItem> mItems;
public UserSearchAdapter(Context context) {
super(context, 0, items);
this.context = context;
vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public UserSearchAdapter(Context context, List<UserSearchItem> items) {
super(context, 0, items);
this.context = context;
vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mItems = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
final UserSearchItem i = mItems.get(position);
if (i != null) {
Log.d("adapter", "in here");
UserSearchItem si = (UserSearchItem) i;
v = vi.inflate(R.layout.user_search_item, null);
final TextView title = (TextView) v
.findViewById(R.id.tv_userSearchName);
if (title != null)
title.setText(si.userName);
}
return v;
}
## Initalization ##
AutocompleteTextview actv = (AutoCompleteTextView) view.findViewById(R.id.etSearchPlace);
## set list response of your web API in adapter ##
SpringArrayAdapter spinnerArrayAdapter = new CustomAdapter<String>(mcontext,android.R.layout.simple_spinner_item, nameList);
## set adapter to Autocomplete Textview ##
actv.setAdapter(spinnerArrayAdapter);
## set your drop down layout in custom adapter##
public class CustomAdapter<T> extends ArrayAdapter<T> {
public CustomAdapter(Context context, int textViewResourceId,
List<T> objects) {
super(context, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if (view instanceof TextView) {
((TextView) view).setTextSize(15);
((TextView) view).setTransformationMethod(null);
Typeface typeface = ResourcesCompat.getFont(parent.getContext(), R.font.montesemibold);
((TextView) view).setTypeface(typeface);
}
return view;
}
}