Android Listview搜索工作不正常

Android Listview搜索工作不正常,android,search,android-listview,android-filter,android-filterable,Android,Search,Android Listview,Android Filter,Android Filterable,请在我的代码中帮助我,它不会搜索完美,除了可搜索的字符串之外,所有其他值都保留在它们的位置上 这是filterable类的代码 import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; import android.app.Activity; import android.content.

请在我的代码中帮助我,它不会搜索完美,除了可搜索的字符串之外,所有其他值都保留在它们的位置上

这是filterable类的代码

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.StringTokenizer;
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Interpolator.Result;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.Filter;
    import android.widget.Filterable;
    import android.widget.TextView;


    public class ListViewAdapter_claimlist extends BaseAdapter implements Filterable{

    Activity context;
    String claimid[];
    String ref[];
    String policy[];
    String natureofloss[];
    String registration[];
    String status[];

    private ItemFilter mFilter = new ItemFilter();

     private List<String>originalData = null;
     private List<String>filteredData = null;

     private List<String>claimidFilter = null;
     private List<String>refFilter = null;
     private List<String>nautreoflossfilter = null;
     private List<String>registrationFilter = null;
     private List<String>statusFilter = null;

     ArrayList<abc> alldata = new ArrayList<abc>();


    public ListViewAdapter_claimlist(Activity context, String[] claimid, String[] ref,String[] policy, String[] natureofloss,String[] registration, String[] status) {
        super();
        this.context = context;
        this.claimid = claimid;
        this.ref = ref;
        this.policy = policy;
        this.natureofloss = natureofloss;
        this.registration = registration;
        this.status = status;

        this.filteredData = new ArrayList<String>(Arrays.asList(this.policy));
        this.originalData = new ArrayList<String>(Arrays.asList(this.policy));

        this.claimidFilter = new ArrayList<String>(Arrays.asList(this.claimid));
        this.refFilter = new ArrayList<String>(Arrays.asList(this.ref));
        this.nautreoflossfilter = new ArrayList<String>(Arrays.asList(this.natureofloss));
        this.registrationFilter = new ArrayList<String>(Arrays.asList(this.registration));
        this.statusFilter = new ArrayList<String>(Arrays.asList(this.status));

        for(int i = 0; i<this.claimid.length; i++)
        {
            abc a = new abc();
            a.setClaimid(claimid[i]);
            a.setRef(ref[i]);
            a.setPolicy(policy[i]);
            a.setNatureofLoss(natureofloss[i]);
            a.setRegistration(registration[i]);
            a.setStatus(status[i]);
            alldata.add(a);
        }

    }

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

    public Object getItem(int position) {
        return filteredData.get(position);
    }

    public long getItemId(int position) {
        return 0;
    }

    private class ViewHolder {
        TextView cliamid;
        TextView ref;
        TextView policy;
        TextView natureofloss;
        TextView registration;
        TextView status;
    }

    public View getView(int position, View convertView, final ViewGroup parent)
    {
        final ViewHolder holder;
        LayoutInflater inflater =  context.getLayoutInflater();
        if (convertView == null)
        {
            convertView = inflater.inflate(R.layout.rowitem_cliamlist, null);
            holder = new ViewHolder();
            holder.cliamid = (TextView) convertView.findViewById(R.id.tv_claims);
            holder.ref = (TextView) convertView.findViewById(R.id.tv_referencepolicy);
            holder.policy = (TextView) convertView.findViewById(R.id.tv_policyNo);
            holder.natureofloss = (TextView) convertView.findViewById(R.id.tv_natureoflos);
            holder.registration = (TextView) convertView.findViewById(R.id.tv_registration);
            holder.status = (TextView) convertView.findViewById(R.id.tv_claimstatus);
            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }
        abc aa = alldata.get(position);
        holder.cliamid.setText(aa.getClaimid());
        holder.ref.setText(aa.getRef());
        holder.policy.setText(filteredData.get(position));
        holder.natureofloss.setText(aa.getNatureofloss());
        holder.registration.setText(aa.getRegistration());
        holder.status.setText(aa.getStatus());

    return convertView;

    }

    //--------------------------------------------------------------------------------
         public Filter getFilter() {
                return mFilter;
            }

            private class ItemFilter extends Filter {
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {

                    String filterString = constraint.toString().toLowerCase();

                    FilterResults results = new FilterResults();

                    final List<String> list = originalData;

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

                    String filterableString ;

                    for (int i = 0; i < count; i++) {
                        filterableString = list.get(i);

                        if (filterableString.toLowerCase().contains(filterString)) {
                            nlist.add(filterableString);


                        }
                    }

                    results.values = nlist;
                    results.count = nlist.size();


                    return results;
                }

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

                    notifyDataSetChanged();
                }

            }

            public class abc
            {
                String claimid;
                String ref;
                String policy;
                String natureofloss;
                String registration;
                String status;

                 public void setClaimid(String claimid)
                 { 
                     this.claimid = claimid;
                 }
                 public void setRef(String ref)
                 {
                     this.ref = ref;
                 }
                 public void setPolicy(String policy)
                 {
                     this.policy = policy;
                 }
                 public void setNatureofLoss(String natureofloss)
                 {
                     this.natureofloss = natureofloss;
                 }
                 public void setRegistration(String registration)
                 {
                     this.registration = registration; 
                 }
                 public void setStatus(String status)
                 {
                     this.status = status; 
                 }

                 public String getClaimid()
                 {
                     String claimid = this.claimid;
                     return claimid;
                 }
                 public String getRef()
                 {

                     String ref = this.ref;
                     return ref;
                 }
                 public String getPolicy()
                 {

                     String Policy = this.policy;
                     return Policy;
                 }
                 public String getNatureofloss()
                 {

                     String Natureofloss = this.natureofloss;
                     return Natureofloss;
                 }
                 public String getRegistration()
                 {

                     String Registration = this.registration;
                     return Registration;
                 }
                 public String getStatus()
                 {

                     String Status = this.status;
                     return Status;
                 }

            }

    }
搜查前

当警察搜查时,无(政策代码)


提前感谢:)

您可以为此选择另一个技巧,在输入搜索文本的编辑文本上设置一个textWatcher

        searchText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                String text = searchText.getText().toString()
                        .toLowerCase(Locale.getDefault());
                lviewAdapter.filter(text);

            }
        });
在适配器类中放置筛选器方法

    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        temp.clear();
        if (charText.length() == 0) {
            temp.addAll(list_original);
        } else {
            for (Abc abc: list_original) {
                 // if you want to search via policy
                if (abc.getPolicy().toLowerCase(Locale.getDefault())
                        .contains(charText)) {
                    temp.add(abc);
                }
            }
        }
        notifyDataSetChanged();
    }

创建两个Abc类型的ArrayList,一个是temp,另一个是original,始终将数据从temp列表传递到getview方法中的listview,这样您就可以在temp中进行更改,而不是在原始列表中进行更改。在上面的例子中,临时列表首先被清除,然后运行循环检查原始列表中的搜索文本是否匹配,然后将该对象添加到临时列表中,并调用notifyDataSetChanged。。瞧,你的数据是从哪里来的?sqlite db?检查:我正在从“WebService”获取数据,并通过一堆数组从主类发送数据将数据存储到sqlite db,它会将您的代码简化为现有代码的1/3很多东西我无法更改为sqlite brother。。。。嗯,Haresh chhelana,我不能在我的代码中完美地实现这一点。请帮我换一种方式兄弟,我是android新手,我无法做出你所说的改变。。。您能在skyp或team viewer上查看我的代码吗?请将您的代码通过电子邮件发送给我@luckysingh781@gmail.com,我会尽力让它工作的
    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        temp.clear();
        if (charText.length() == 0) {
            temp.addAll(list_original);
        } else {
            for (Abc abc: list_original) {
                 // if you want to search via policy
                if (abc.getPolicy().toLowerCase(Locale.getDefault())
                        .contains(charText)) {
                    temp.add(abc);
                }
            }
        }
        notifyDataSetChanged();
    }