gpt4 book ai didi

带有来自 Web 服务的数据的 Android AutoCompleteTextView,显示建议列表时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:46:57 25 4
gpt4 key购买 nike

一个我无法解决的问题。

我想要实现的目标:在来自 Web 服务调用的 AutoCompleteTextView 中显示建议。最终结果应该是这样的:

enter image description here

到目前为止我做了什么:

在我的布局中,我有一个像这样的 AutoCompleteTextView

 <AutoCompleteTextView
android:id="@+id/txtAutoSearch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:selectAllOnFocus="true"
android:singleLine="true" />

在我的 Activity 中我有这个:

 autoCompleteAdapter = new AdapterAutoComplete(context, ????? what should I have here?????, null);
autoCompleteAdapter.setNotifyOnChange(true);
txtAutoSearch.setAdapter(autoCompleteAdapter);
txtAutoSearch.addTextChangedListener(new TextWatcher() {

private boolean shouldAutoComplete = true;

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
shouldAutoComplete = true;

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

@Override
public void afterTextChanged(Editable s) {
if (shouldAutoComplete) {
new GetAutoSuggestionsTask().execute(s.toString());
}
}

});

AsyncTask 非常简单,onPostExecute 我用从 web 服务返回的数据设置适配器

autoCompleteAdapter = new AdapterAutoComplete(context, ????? what should I have here?????,result);
txtAutoSearch.setAdapter(autoCompleteAdapter);

适配器看起来像这样:

public class AdapterAutoComplete  extends ArrayAdapter<Person> {

private Activity activity;
private List<Person> lstPersons;
private static LayoutInflater inflater = null;

public AdapterAutoComplete(Activity a, int textViewResourceId, List<Person> lst) {
super(a, textViewResourceId, lst);
activity = a;
lstPersons = lst;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public int getCount() {
return lstPersons.size();
}

public long getItemId(int position) {
return position;
}

public Person getCurrentPerson(int position) {
return lstPersons.get(position);
}

public void removeItem(int position) {
lstPersons.remove(position);
}

public static class ViewHolder {
public TextView txtName;
public TextView txtProfession;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
ViewHolder holder;
if (convertView == null) {
vi = inflater.inflate(R.layout.people_list_item, null);
Utils.overrideFonts(activity, vi);

holder = new ViewHolder();
holder.txtName = (TextView) vi.findViewById(R.id.txtName);
holder.txtProfession = (TextView) vi.findViewById(R.id.txtProfession);

vi.setTag(holder);
} else {
holder = (ViewHolder) vi.getTag();
}

Person o = lstPersons.get(position);

if (o.name != null) {
holder.txtName.setText(o.name);
} else {
holder.txtName.setText("N/A");
}

if (o.profession != null) {
holder.txtProfession.setText(o.profession);
} else {
holder.txtProfession.setText("N/A");
}
return vi;
}
}

实际发生了什么:

  • 网络服务返回我需要的列表,因此数据可用
  • 在 Adapter 中,getView 似乎没有执行,所以我猜其中有什么地方做错了。
  • 没有显示我的值(value)观的建议列表
  • 我不知道我需要什么适配器构造函数,textViewResourceId。我究竟做错了什么?我被卡住了,请帮忙。

最佳答案

快速浏览文档后,您似乎走对了路。

您需要让异步请求从外部源获取结果列表。应在每次按键时重新检查自动完成(取消先前的数据请求),这应该使用 addTextChangedListener 触发,这就是您正在做的。到目前为止一切顺利。

根据这个结果列表,您需要构建并填充一个适配器:您的自定义适配器应该扩展 ListAdapter 和 Filterable(如 setAdapter() 文档中所述)。

一旦你有了一个适配器,它应该像调用一样简单:

// AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.countries_list);
textView.setAdapter(adapter);

请记住,任何 UI 更改都应在 UI 线程或使用处理程序上完成。

当适配器有以下情况时应该调用 getView():

  • 通过 setAdapter() 更改
  • .notifyDataSetChanged() 已在 ListView 上调用。

如果以上两个事件都没有引起新的getView(),你应该确保方法getCount()getItem() 正在返回正确的值。

关于带有来自 Web 服务的数据的 Android AutoCompleteTextView,显示建议列表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9192293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com