Android onItemClick将文本设置为AutoCompleteTextView

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

我已经在我的自动完成文本视图中添加了一个ContextChangedListener,并使用异步任务填充它

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