android – AutoCompleteTextView使用HashMap onItemClick项目位置或id

android – AutoCompleteTextView使用HashMap onItemClick项目位置或id,第1张

概述我是 Android开发新手,遇到了一个我很难解决的问题.我试图弄清楚如何正确使用AutoCompleteTextView小部件.我想使用来自Web服务的XML数据创建AutoCompleteTextView.我设法让它工作,但我对输出肯定不满意. 我想放一个id =>的HashMap;将名称对配入AutoCompleteTextView并获取所单击项目的ID.当我点击自动完成过滤集输出时,我想填 我是 Android开发新手,遇到了一个我很难解决的问题.我试图弄清楚如何正确使用autoCompleteTextVIEw小部件.我想使用来自Web服务的XML数据创建autoCompleteTextVIEw.我设法让它工作,但我对输出肯定不满意.

我想放一个ID =>的HashMap;将名称对配入autoCompleteTextVIEw并获取所单击项目的ID.当我点击自动完成过滤集输出时,我想填充自动完成框下面的列表,我也设法开始工作.

到目前为止:

> autocomplete适用于简单的ArrayList,所有数据都经过过滤正确
>单击后onItemClick事件正常触发
> parent.getItemAtposition(position)返回所单击项的正确String表示形式

事件onItemClick(AdapterVIEw父,VIEw v,int position,long ID)不按我的意愿行事.如何确定所点击项目的未过滤数组位置?过滤后的位置是我不感兴趣的位置.

进一步的问题:

>如何在autoCompleteTextVIEw中处理HashMaps或集合
>如何在onItemClick事件中获取正确的itemID

我对这个问题进行了非常广泛的研究,但没有找到任何有价值的信息来回答我的问题.

解决方法

How to handle HashMaps or Collections in autoCompleteTextVIEw

您可以设置自己的自定义适配器.在适配器中,由您决定将数据放到给定位置.

How to get the right itemID in the onItemClick event

在自定义适配器中,定义过滤器,该过滤器设置建议的项目.您有两个不同的列表,一个包含原始值,另一个包含已过滤的项目.我的意思是这样的.

private class autoCompleteItemAdapter extends ArrayAdapter<YourItemClass> implements Filterable {    private nameFilter      mFilter;    List<YourItemClass> suggestions;    List<YourItemClass> mOriginalValues;    public autoCompleteItemAdapter(Context context,int resource,List<YourItemClass> suggestions) {        super(context,resource,suggestions);        this.suggestions = suggestions;        this.mOriginalValues = suggestions;    }    public voID updateData(List<YourItemClass> suggestions) {               mlock.lock();               try{                   this.suggestions = suggestions;                       this.mOriginalValues = suggestions;            finally{                mlock.unlock();            }        }    @OverrIDe    public int getCount() {        mlock.lock();        try {            return suggestions.size();        } finally {            mlock.unlock();        }    }    @OverrIDe    public YourItemClass getItem(int position) {        return mOriginalValues.get(position);    }    @OverrIDe    public VIEw getVIEw(int position,VIEw convertVIEw,VIEwGroup parent) {        // draw your item here...    }    @OverrIDe    public Filter getFilter() {        if (mFilter == null) {            mFilter = new nameFilter();        }        return mFilter;    }    private class nameFilter extends Filter {        @OverrIDe        protected FilterResults performFiltering(CharSequence prefix) {            FilterResults results = new FilterResults();            if (mOriginalValues == null) {                mlock.lock();                try {                    mOriginalValues = new ArrayList<YourItemClass>(suggestions);                } finally {                    mlock.unlock();                }            }            if (prefix == null || prefix.length() == 0) {                mlock.lock();                try {                    ArrayList<YourItemClass> List = new ArrayList<YourItemClass>(mOriginalValues);                    results.values = List;                    results.count = List.size();                } finally {                    mlock.unlock();                }            } else {                String prefixString = prefix.toString().tolowerCase();                final List<YourItemClass> values = mOriginalValues;                final int count = values.size();                final ArrayList<YourItemClass> newValues = new ArrayList<YourItemClass>(count);                //              FILTERING                //                    // add your hits to the newValues collection                //                //                results.values = newValues;                results.count = newValues.size();            }            return results;        }        @OverrIDe        protected voID publishResults(CharSequence constraint,FilterResults results) {            mlock.lock();            try {                if (results == null || results.values == null) return;                 suggestions = new ArrayList<YourItemClass>();                suggestions = (List<YourItemClass>) results.values;                if (results.count > 0) {                    notifyDataSetChanged();                } else {                    notifyDataSetInvalIDated();                }            } finally {                mlock.unlock();            }        }    }}

现在这可能引发一些并发问题,因为我们引用,适配器可能会询问列表的大小,并且更大的值会消失,这可能会导致getVIEw函数出现问题. (fi:尝试用底层数据绘制5个元素只有4个,因为我们做了另一个过滤)这就是我们使用autoCompleteTextVIEw的方式,到目前为止它工作得很好,没问题.我刚刚提到我仍然担心,我有这种模糊的感觉,有一个更好的解决方案.

在onClick侦听器中,使用返回的值(来自已过滤的列表)作为地图中的键,并获取关联的值.你可以认为你的列表使用了HashMap的索引.之后,您可以使用地图绘制项目,或获取自己的数据.

总结

以上是内存溢出为你收集整理的android – AutoCompleteTextView使用HashMap onItemClick项目位置或id全部内容,希望文章能够帮你解决android – AutoCompleteTextView使用HashMap onItemClick项目位置或id所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1135179.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存