自定义筛选ArrayAdapter中的ListView [英] Custom Filtering ArrayAdapter in ListView

查看:179
本文介绍了自定义筛选ArrayAdapter中的ListView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Android的一个初学者,但我试图使自定义列表视图过滤和我它的工作不知。唯一的问题我已经是我一直保留值的ArrayList(原始的ArrayList),是越来越低,在每一个过滤项目。我无法解释这一点,但我认为你可以帮我莫名其妙。

反正这里是自定义ArrayAdaptor:

 公共类PkmnAdapter扩展ArrayAdapter< Pkmn> {

私人的ArrayList< Pkmn>原版的;
私人的ArrayList< Pkmn> fitems;
私人过滤器过滤;

公共PkmnAdapter(上下文的背景下,INT textViewResourceId,ArrayList的< Pkmn>项目){
        超(背景下,textViewResourceId,项目);
        this.original =项目; //新的ArrayList< Pkmn>();
        this.fitems =项目; //新的ArrayList< Pkmn>();
}

@覆盖
公共无效添加(Pkmn项目){
    original.add(项目);
}

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
        视图V = convertView;
        如果(V == NULL){
            LayoutInflater VI =(LayoutInflater)的getContext()getSystemService(Context.LAYOUT_INFLATER_SERVICE)。
            V = vi.inflate(R.layout.row,NULL);
        }
        Pkmn pkmn = original.get(位置);
        如果(pkmn!= NULL){
                TextView的TT =(TextView中)v.findViewById(R.id.RlabPName);
                TextView的DEX =(TextView中)v.findViewById(R.id.RlabDex);
                ImageView的IMG =(ImageView的)v.findViewById(R.id.RimgPkmn);

                如果(!TT =空){tt.setText(pkmn.getName()); }
                如果(!DEX = NULL){dex.setText(CalcDex(pkmn.getId())); }
                如果(IMG!= NULL){
                    INT渣油=的getContext()getResources()则getIdentifier(DEX+ pkmn.getId(),可拉伸,com.compileguy.pokebwteam)。。;
                    img.setImageResource(渣油);
                }
        }
        返回伏;
}

@覆盖
公共过滤用getFilter()
{
    如果(过滤== NULL)
        过滤器=新PkmnNameFilter();

    返回过滤器;
}

私有类PkmnNameFilter扩展过滤器
{
        @覆盖
        保护FilterResults performFiltering(CharSequence的约束)
        {
            FilterResults结果=新FilterResults();
            字符串preFIX = constraint.toString()与toLowerCase()。

            如果(preFIX == NULL || prefix.length()== 0)
            {
                ArrayList的< Pkmn>名单=新的ArrayList< Pkmn>(原件);
                results.values​​ =清单;
                results.count =则为list.size();
            }
            其他
            {
                最后的ArrayList< Pkmn>名单=原件;

                诠释计数=则为list.size();
                最后的ArrayList< Pkmn> NLIST =新的ArrayList< Pkmn>(计数);

                的for(int i = 0; I<计数;我++)
                {
                    最终Pkmn pkmn = list.get(ⅰ);
                    最终的字符串值= pkmn.getName()与toLowerCase()。

                    如果(value.startsWith(preFIX))
                    {
                        nlist.add(pkmn);
                    }
                }
                results.values​​ = NLIST;
                results.count = nlist.size();
            }
            返回结果;
        }

        @燮pressWarnings(未登记)
        @覆盖
        保护无效publishResults(CharSequence的约束,FilterResults结果){
            fitems =(ArrayList的< Pkmn>)results.values​​;
            明确();
            诠释计数= fitems.size();
            的for(int i = 0; I<计数;我++)
            {
                Pkmn pkmn =(Pkmn)fitems.get(ⅰ);
                加(pkmn);
            }

            如果(fitems.size()大于0)
                notifyDataSetChanged();
            其他
                notifyDataSetInvalidated();
        }

    }


私人字符串CalcDex(INT ID){
    字符串s =将String.valueOf(ID);
    如果(s.length()== 1)
        S =00+ S;
    否则如果(s.length()== 2)
        S =0+ S;
    回报'#'+ S;
}
 

}

注:该列表视图中显示出正确的项目,但是当对的exaple我在编辑框中删除信(这将触发过滤),这就是问题的开始。

---编辑---

@Janusz:非常感谢您的回答。这解决了我的问题。

下面是源$ C ​​$ C对我的作品,因此,如果任何人有同样的问题,他们可以试试这个:

 私人的ArrayList< Pkmn>原版的;
私人的ArrayList< Pkmn> fitems;
私人过滤器过滤;

公共PkmnAdapter(上下文的背景下,INT textViewResourceId,ArrayList的< Pkmn>项目){
        超(背景下,textViewResourceId,项目);
        this.original =新的ArrayList< Pkmn>(项目);
        this.fitems =新的ArrayList< Pkmn>(项目);
}

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
        视图V = convertView;
        如果(V == NULL){
            LayoutInflater VI =(LayoutInflater)的getContext()getSystemService(Context.LAYOUT_INFLATER_SERVICE)。
            V = vi.inflate(R.layout.row,NULL);
        }
        Pkmn pkmn = fitems.get(位置);
        如果(pkmn!= NULL){
                TextView的TT =(TextView中)v.findViewById(R.id.RlabPName);
                TextView的DEX =(TextView中)v.findViewById(R.id.RlabDex);
                ImageView的IMG =(ImageView的)v.findViewById(R.id.RimgPkmn);

                如果(!TT =空){tt.setText(pkmn.getName()); }
                如果(!DEX = NULL){dex.setText(CalcDex(pkmn.getId())); }
                如果(IMG!= NULL){
                    INT渣油=的getContext()getResources()则getIdentifier(DEX+ pkmn.getId(),可拉伸,com.compileguy.pokebwteam)。。;
                    img.setImageResource(渣油);
                }
        }
        返回伏;
}

@覆盖
公共过滤用getFilter()
{
    如果(过滤== NULL)
        过滤器=新PkmnNameFilter();

    返回过滤器;
}

私有类PkmnNameFilter扩展过滤器
{
        @覆盖
        保护FilterResults performFiltering(CharSequence的约束)
        {
            FilterResults结果=新FilterResults();
            字符串preFIX = constraint.toString()与toLowerCase()。

            如果(preFIX == NULL || prefix.length()== 0)
            {
                ArrayList的< Pkmn>名单=新的ArrayList< Pkmn>(原件);
                results.values​​ =清单;
                results.count =则为list.size();
            }
            其他
            {
                最后的ArrayList< Pkmn>名单=新的ArrayList< Pkmn>(原件);
                最后的ArrayList< Pkmn> NLIST =新的ArrayList< Pkmn>();
                诠释计数=则为list.size();

                的for(int i = 0; I<计数;我++)
                {
                    最终Pkmn pkmn = list.get(ⅰ);
                    最终的字符串值= pkmn.getName()与toLowerCase()。

                    如果(value.startsWith(preFIX))
                    {
                        nlist.add(pkmn);
                    }
                }
                results.values​​ = NLIST;
                results.count = nlist.size();
            }
            返回结果;
        }

        @燮pressWarnings(未登记)
        @覆盖
        保护无效publishResults(CharSequence的约束,FilterResults结果){
            fitems =(ArrayList的< Pkmn>)results.values​​;

            明确();
            诠释计数= fitems.size();
            的for(int i = 0; I<计数;我++)
            {
                Pkmn pkmn =(Pkmn)fitems.get(ⅰ);
                加(pkmn);
            }
        }

    }
}
 

解决方案

您的问题是此行:

  this.original =项目;
this.fitems =项目;
 

产品是您用于ListView和把它在两个不同的变量不会使两个不同的列表出来的名单。你只给列表项两个不同的名字。

您可以使用:

  this.fitems =新的ArrayList(项目);
 

这应该产生一个新的名单,这名单上的改变,只会改变fitems列表。

I am a begginer in Android but I tried to make a custom listview filtering and I it worked somehow. The only problem I have is that the ArrayList that I kept all the values ( "original" ArrayList ) , is getting lower and lower on items in every filtering. I can't explain this but I thought that you can help me somehow .

Anyway here is the Custom ArrayAdaptor :

public class PkmnAdapter extends ArrayAdapter<Pkmn> {

private ArrayList<Pkmn> original;
private ArrayList<Pkmn> fitems;
private Filter filter;

public PkmnAdapter(Context context, int textViewResourceId, ArrayList<Pkmn> items) {
        super(context, textViewResourceId, items);
        this.original = items;//new ArrayList<Pkmn>();
        this.fitems = items;//new ArrayList<Pkmn>();
}

@Override
public void add(Pkmn item){
    original.add(item);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);
        }
        Pkmn pkmn = original.get(position);
        if (pkmn != null) {
                TextView tt = (TextView) v.findViewById(R.id.RlabPName);
                TextView dex = (TextView)v.findViewById(R.id.RlabDex);
                ImageView img = (ImageView)v.findViewById(R.id.RimgPkmn);

                if (tt != null) { tt.setText(pkmn.getName()); }
                if (dex != null){ dex.setText(CalcDex(pkmn.getId())); }
                if (img != null){
                    int resId = getContext().getResources().getIdentifier("dex" + pkmn.getId(), "drawable", "com.compileguy.pokebwteam");
                    img.setImageResource(resId);
                }
        }
        return v;
}

@Override
public Filter getFilter()
{
    if (filter == null)
        filter = new PkmnNameFilter();

    return filter;
}

private class PkmnNameFilter extends Filter
{
        @Override
        protected FilterResults performFiltering(CharSequence constraint)
        {   
            FilterResults results = new FilterResults();
            String prefix = constraint.toString().toLowerCase();

            if (prefix == null || prefix.length() == 0)
            {
                ArrayList<Pkmn> list = new ArrayList<Pkmn>(original);
                results.values = list;
                results.count = list.size();
            }
            else
            {
                final ArrayList<Pkmn> list = original;

                int count = list.size();
                final ArrayList<Pkmn> nlist = new ArrayList<Pkmn>(count);

                for (int i=0; i<count; i++)
                {
                    final Pkmn pkmn = list.get(i);
                    final String value = pkmn.getName().toLowerCase();

                    if (value.startsWith(prefix))
                    {
                        nlist.add(pkmn);
                    }
                }
                results.values = nlist;
                results.count = nlist.size();
            }
            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            fitems = (ArrayList<Pkmn>)results.values;
            clear();
            int count = fitems.size();
            for (int i=0; i<count; i++)
            {
                Pkmn pkmn = (Pkmn)fitems.get(i);
                add(pkmn);
            }

            if (fitems.size() > 0)
                notifyDataSetChanged();
            else
                notifyDataSetInvalidated();
        }

    }


private String CalcDex(int id){
    String s = String.valueOf(id);
    if (s.length() == 1)
        s = "00"+s;
    else if (s.length() == 2)
        s = "0"+s;
    return '#'+s;
}

}

NOTE: The listview is showing correctly the items but when for exaple I remove a letter in the editbox ( which triggers the filtering ) this is where the problems start.

--- EDIT ---

@Janusz: Many thanks for your answer . That solved my problem .

Here is the source code that works for me , so if anyone has the same issue they could try this one :

private ArrayList<Pkmn> original;
private ArrayList<Pkmn> fitems;
private Filter filter;

public PkmnAdapter(Context context, int textViewResourceId, ArrayList<Pkmn> items) {
        super(context, textViewResourceId, items);
        this.original = new ArrayList<Pkmn>(items);
        this.fitems = new ArrayList<Pkmn>(items);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);
        }
        Pkmn pkmn = fitems.get(position);
        if (pkmn != null) {
                TextView tt = (TextView) v.findViewById(R.id.RlabPName);
                TextView dex = (TextView)v.findViewById(R.id.RlabDex);
                ImageView img = (ImageView)v.findViewById(R.id.RimgPkmn);

                if (tt != null) { tt.setText(pkmn.getName()); }
                if (dex != null){ dex.setText(CalcDex(pkmn.getId())); }
                if (img != null){
                    int resId = getContext().getResources().getIdentifier("dex" + pkmn.getId(), "drawable", "com.compileguy.pokebwteam");
                    img.setImageResource(resId);
                }
        }
        return v;
}

@Override
public Filter getFilter()
{
    if (filter == null)
        filter = new PkmnNameFilter();

    return filter;
}

private class PkmnNameFilter extends Filter
{
        @Override
        protected FilterResults performFiltering(CharSequence constraint)
        {   
            FilterResults results = new FilterResults();
            String prefix = constraint.toString().toLowerCase();

            if (prefix == null || prefix.length() == 0)
            {
                ArrayList<Pkmn> list = new ArrayList<Pkmn>(original);
                results.values = list;
                results.count = list.size();
            }
            else
            {
                final ArrayList<Pkmn> list = new ArrayList<Pkmn>(original);
                final ArrayList<Pkmn> nlist = new ArrayList<Pkmn>();
                int count = list.size();

                for (int i=0; i<count; i++)
                {
                    final Pkmn pkmn = list.get(i);
                    final String value = pkmn.getName().toLowerCase();

                    if (value.startsWith(prefix))
                    {
                        nlist.add(pkmn);
                    }
                }
                results.values = nlist;
                results.count = nlist.size();
            }
            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            fitems = (ArrayList<Pkmn>)results.values;

            clear();
            int count = fitems.size();
            for (int i=0; i<count; i++)
            {
                Pkmn pkmn = (Pkmn)fitems.get(i);
                add(pkmn);
            }
        }

    }
}

解决方案

Your problem are this lines:

this.original = items;
this.fitems = items;

Items is the list you use for your ListView and putting it in two different variables does not make two different lists out of it. You are only giving the list items two different names.

You can use:

this.fitems = new ArrayList(items);

that should generate a new List and changes on this list will only change the fitems list.

这篇关于自定义筛选ArrayAdapter中的ListView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆