Android onItemClick将文本设置为AutoCompleteTextView
我已经在我的自动完成文本视图中添加了一个ContextChangedListener,并使用异步任务填充它Android onItemClick将文本设置为AutoCompleteTextView,android,Android,我已经在我的自动完成文本视图中添加了一个ContextChangedListener,并使用异步任务填充它 mAutoComplete.addTextChangedListener(new TextWatcher() { public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSe
mAutoComplete.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
//run an async tast to get autocompletes
}
@Override
public void afterTextChanged(Editable s) {
}
});
private class getAutoCompletes extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
//get autocompletes
}
@Override
protected void onPostExecute(String result) {
//create an adapter
mAdapter AutoCompleteAdapter = new mAdapter(
mActivity.this,
R.layout.m_layout,
R.id.m_id, autocompletesList);
//set it to the autocomplete textview
mAutoComplete.setAdapter(AutoCompleteAdapter);
//show the dropdown
mAutoComplete.showDropDown();
}
}
没有,我正在为mAutoComplete设置文本
编辑:
public class mAdapter extends ArrayAdapter<customDS> {
private LayoutInflater mInflater = null;
private Context ctx;
public ArrayList<customDS> values = new ArrayList<customDS>();
public mAdapter(Context context, int resource,
int textViewResourceId, ArrayList<customDS> objects) {
super(context, resource, textViewResourceId, objects);
values = objects;
ctx = context;
mInflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return values.size();
}
public customDS getItem(int position) {
return values.get(position);
}
public long getItemId(int position) {
return position;
}
public static class ViewHolder {
public TextView title;
public TextView description;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.m_layout,
parent, false);
holder.title = (TextView) convertView
.findViewById(R.id.m_id);
holder.description = (TextView) convertView
.findViewById(R.id.m_id2);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText(values.get(position).title);
holder.description.setText(values.get(position).description);
return convertView;
}
}
适配器类:
public class mAdapter extends ArrayAdapter<customDS> {
private LayoutInflater mInflater = null;
private Context ctx;
public ArrayList<customDS> values = new ArrayList<customDS>();
public mAdapter(Context context, int resource,
int textViewResourceId, ArrayList<customDS> objects) {
super(context, resource, textViewResourceId, objects);
values = objects;
ctx = context;
mInflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return values.size();
}
public customDS getItem(int position) {
return values.get(position);
}
public long getItemId(int position) {
return position;
}
public static class ViewHolder {
public TextView title;
public TextView description;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.m_layout,
parent, false);
holder.title = (TextView) convertView
.findViewById(R.id.m_id);
holder.description = (TextView) convertView
.findViewById(R.id.m_id2);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText(values.get(position).title);
holder.description.setText(values.get(position).description);
return convertView;
}
}
公共类mAdapter扩展了ArrayAdapter{
私有LayoutInflater mInflater=null;
私有上下文ctx;
public ArrayList value=new ArrayList();
公共mAdapter(上下文、int资源、,
int textViewResourceId,ArrayList对象){
超级(上下文、资源、textViewResourceId、对象);
价值=对象;
ctx=上下文;
mInflater=(LayoutInflater)ctx
.getSystemService(上下文布局\充气机\服务);
}
public int getCount(){
返回值。size();
}
公共customDS getItem(内部位置){
返回值.get(位置);
}
公共长getItemId(int位置){
返回位置;
}
公共静态类视图持有者{
公共文本视图标题;
公共文本视图描述;
}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
holder=新的ViewHolder();
convertView=mInflater.充气(R.layout.m_布局,
父母,假);
holder.title=(TextView)convertView
.findviewbyd(R.id.m_id);
holder.description=(TextView)convertView
.findviewbyd(R.id.m_id2);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.title.setText(values.get(position.title));
holder.description.setText(value.get(position.description));
返回视图;
}
}
但是,我仍然可以将适配器的字符串表示为
mAutoComplete,当我单击下拉列表中的任何项目时
这是因为当您从下拉列表中选择一个项目时,自动完成小部件将调用toString()
方法来填充插入输入的EditText
尝试重写
customDS
类的toString()
方法,以从对象返回您想要在那里看到的内容。您可以创建AutoCompleteTextView的子类并重写“replaceText”方法,就像在它的超类(AutoCompleteTextView)“replaceText”中一样用于在单击结果时替换视图中的当前文本
public class CustomAutoCompleteTextView extends AutoCompleteTextView {
public CustomAutoCompleteTextView(Context context) {
super(context);
}
public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomAutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void replaceText(CharSequence text) {
// do nothing so that the text stays the same
}
}
这更简单。尝试将此添加到您的活动中。它对我有用
mAutoComplete.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mAutoComplete.setText(((TextView) view).getText());
// Or maybe you need to do something like this (it depends from your R.layout.m_layout):
// LinearLayout l = (LinearLayout) view;
// TextView t = (TextView) l.getChildAt(0);
// mAutoComplete.setText(t.getText());
}
});
mAutoComplete.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
mAutoComplete.setText(((TextView)视图).getText());
//或者您可能需要这样做(这取决于您的R.layout.m_布局):
//LinearLayout l=(LinearLayout)视图;
//TextView t=(TextView)l.getChildAt(0);
//mAutoComplete.setText(t.getText());
}
});
除了jaredpetker的解决方案:
@Override
protected void replaceText(CharSequence text) {
Editable currentText = getText();
super.replaceText(currentText);
}
您只需执行以下操作。setText(“”);在其文本视图中,单击以避免在AutocompleteTextView上设置任何文本。下面是一个例子:
private AdapterView.OnItemClickListener onItemClickListener =
new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
query.setText("");
UsersVO vo= (UsersVO)adapterView.getItemAtPosition(i);
Intent intent=new Intent(ActivityA.this, ActivityB.class);
intent.putExtra("NAME",vo.getName());
intent.putExtra("USER",vo.getUser());
startActivity(intent);
}
};
private AdapterView.OnItemClickListener OnItemClickListener=
新的AdapterView.OnItemClickListener(){
@凌驾
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
query.setText(“”);
UsersVO vo=(UsersVO)adapterView.getItemAtPosition(i);
意向意向=新意向(ActivityA.this,ActivityB.class);
intent.putExtra(“NAME”,vo.getName());
intent.putExtra(“USER”,vo.getUser());
星触觉(意向);
}
};
其中查询是autoCompleteTextView。customDS对象的外观如何?在此添加其源代码。我不想设置任何文本,我希望文本是键入的。@Archie.bpgc是否希望用户选择一个项目,但保留以前在
EditText
中输入的文本?对于用户来说,在处理自动完成小部件时,这是非常违反直觉的。下拉列表有不同类型的项目。对于特定类型的项目,如果用户选择了它,会弹出一个请求继续/取消的弹出窗口,等等取消我希望文本保持原来的状态(仅限于用户键入的内容)。@Archie.bpgc这对用户来说听起来也很不直观(因此您可能希望让用户选择他/她想要的内容,并让它使用按钮进行进一步操作)(请求权限)。但是,没有任何东西阻止您将用户输入的文本存储在某个变量中(在TextWatcher
中),然后使用它将小部件恢复到初始状态。@XtremeBiker重写convertSelectionToString()AutoCompleteTextView
的方法,并返回一个表示所选对象的任何部分的CharSequence
。默认情况下,该方法对所选项目调用toString()
。看起来非常粗糙,但只有当toString()
当前对象的实现包含了您真正想要显示的内容……这有点像,但除了做一些完全自定义的事情外,在阅读AutoCompleteTextView源代码后,这似乎是一个不错的解决方案。此外,我自己也使用了一段时间,它的性能似乎很好。看看其他解决方案的注释。还有一个更好的解决方案。更好的解决方案有点主观。我以前见过另一个解决方案,但不是它的粉丝(通过文本观察程序保存和恢复文本等)。鉴于我的用例基本上不需要replaceText功能,似乎适合让它什么都不做。我认为这两种方法都是有效的。R