Android ArrayAdapter过滤问题

Android ArrayAdapter过滤问题,第1张

概述因为我想使用“自定义列表适配器”,以便可以为列表设置样式,但“过滤器”功能无法正常工作.我可以使用基本的过滤功能,但是一旦过滤结果列表小于我开始过滤时显示的listItems数量,应用程序就会崩溃.这段代码中还有第二个问题,我不确定是否相关,但是何时明确();在publishResults中

因为我想使用“自定义列表适配器”,以便可以为列表设置样式,但“过滤器”功能无法正常工作.我可以使用基本的过滤功能,但是一旦过滤结果列表小于我开始过滤时显示的ListItems数量,应用程序就会崩溃.

这段代码中还有第二个问题,我不确定是否相关,但是何时
明确();在publishResults中运行,然后应用程序也崩溃.

这是我正在使用的代码.

package com.androID.example;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;import androID.content.Context;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.ArrayAdapter;import androID.Widget.Filter;import androID.Widget.TextVIEw;public class Customlistadapter extends ArrayAdapter<String> {    private Context mContext; private String[] items;private String[] filtered;public Customlistadapter(Context context, int textVIEwResourceID, String[] items) {        super(context, textVIEwResourceID, items);        this.filtered = items;        this.items = filtered;        setNotifyOnChange(true);        mContext = context;}@OverrIDepublic VIEw getVIEw(int position, VIEw convertVIEw, VIEwGroup parent) {     VIEw v = convertVIEw;     if (v == null) {         LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);         v = vi.inflate(R.layout.List_item, null);     }     String o = filtered[position];     if (o != null) {             TextVIEw tt = (TextVIEw) v.findVIEwByID(R.ID.tvVIEwRow);             if (tt != null) {                   tt.setText("name: "+o);             }     }     return v;}public voID notifyDataSetInvalIDated(){    super.notifyDataSetInvalIDated();}private Filter filter;public Filter getFilter(){    if(filter == null)        filter = new nameFilter();    return filter;}private class nameFilter extends Filter{    @OverrIDe    protected FilterResults performFiltering(CharSequence constraint) {        // NOTE: this function is *always* called from a background thread, and        // not the UI thread.        constraint = constraint.toString().tolowerCase();        FilterResults result = new FilterResults();        if(constraint != null && constraint.toString().length() > 0)        {            ArrayList<String> filt = new ArrayList<String>();            List<String> litems = new ArrayList<String>();            synchronized (items)            {                     litems = Arrays.asList(items);                  //Collections.copy(litems, Arrays.asList(items));            }            for(int i = 0, l = litems.size(); i < l; i++)            {                String m = litems.get(i);                if(m.tolowerCase().startsWith(constraint.toString()))                    filt.add(m);            }            result.count = filt.size();            result.values = filt.toArray(new String[0]);        }        else        {            synchronized(items)            {                result.values = items;                result.count = Arrays.asList(items).size();            }        }        return result;    }    @OverrIDe    protected voID publishResults(CharSequence constraint, FilterResults results) {        // NOTE: this function is *always* called from the UI thread.            filtered = (String[])results.values;            notifyDataSetChanged();            clear();            notifyDataSetInvalIDated();    }}

}

解决方法:

我只是有同样的问题.只需将getCount()方法放在适配器类中即可.它应该返回过滤后的计数.像这样:

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

我过滤了mItems.

总结

以上是内存溢出为你收集整理的Android ArrayAdapter过滤问题全部内容,希望文章能够帮你解决Android ArrayAdapter过滤问题所遇到的程序开发问题。

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

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

原文地址: https://outofmemory.cn/web/1069007.html

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

发表评论

登录后才能评论

评论列表(0条)

保存