0

我无法在我的 Android 应用程序中进行研究。我创建了一个editText,并在其中添加了一个TextWatcher。在我的自定义数组适配器中,我重写了 getFilter 函数来过滤结果并更新列表视图。

我创建了一个edittext并设置它:

et.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            adapter.getFilter().filter(s.toString());               
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            //ContactActivity.this.adapter.getFilter().filter(arg0);                
        }

我的 ContactAdapter 是:

    public ContactAdapter(Context context, int textViewResourceId, ArrayList<String> objects) {
        super(context, textViewResourceId, objects);
        this.objects = objects;
    }

    /*
     * we are overriding the getView method here - this is what defines how each
     * list item will look.
     */
    public View getView(int position, View convertView, ViewGroup parent){

        // assign the view we are converting to a local variable
        View v = convertView;

        // first check to see if the view is null. if so, we have to inflate it.
        // to inflate it basically means to render, or show, the view.
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.list_item, null);
        }

        /*
         * Recall that the variable position is sent in as an argument to this method.
         * The variable simply refers to the position of the current object in the list. (The ArrayAdapter
         * iterates through the list we sent it)
         * 
         * Therefore, i refers to the current Item object.
         */
        String i = objects.get(position);

        TextView tt = (TextView) v.findViewById(R.id.name);

        if (i != null) {

            // This is how you obtain a reference to the TextViews.
            // These TextViews are created in the XML files we defined.

            if (tt != null){

                tt.setText(i);
            }

        }

        // the view must be returned to our activity
        return v;

    }


    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                ArrayList<String> list  = (ArrayList<String>) results.values;
                int size = list.size();

                //list.clear();
                for (int i = 0; i<list.size();i++){
                    add(list.get(i));
                }
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                ArrayList<String> filteredResults = getFilteredResults(constraint);

                FilterResults results = new FilterResults();
                results.values = filteredResults;

                return results;
            }

            private ArrayList<String> getFilteredResults(CharSequence constraint) {
                ArrayList<String> names = ContactAdapter.this.objects;
                    ArrayList<String> filteredNames = new ArrayList<String>();
                    for(int i=0;i< names.size();i++){
                        if(names.get(i).toLowerCase().startsWith(constraint.toString().toLowerCase())){
                            filteredNames.add(names.get(i));
                        }
                    }

                    return filteredNames;
                }
        };
    }
}

建议?谢谢

4

2 回答 2

0

源代码 [main.xml] 是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/LinearLayout01"
                android:layout_width="fill_parent"
android:layout_height="fill_parent"
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:orientation="vertical">
<EditText android:id="@+id/EditText01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:hint="Search">
</EditText>

<ListView android:id="@+id/ListView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>

源代码 [ListViewSearchExample.java] 是

package com.ListViewSearchExample;

import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

public class ListViewSearchExample extends Activity
{
private ListView lv;
private EditText et;
private String listview_array[] = { "ONE", "TWO", "THREE", "FOUR", "FIVE",
"SIX", "SEVEN", "EIGHT", "NINE", "TEN" };
private ArrayList<String> array_sort= new ArrayList<String>();
int textlength=0;

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

lv = (ListView) findViewById(R.id.ListView01);
et = (EditText) findViewById(R.id.EditText01);
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, listview_array));

et.addTextChangedListener(new TextWatcher()
{
public void afterTextChanged(Editable s)
{
                                                                // Abstract Method of TextWatcher Interface.
}
public void beforeTextChanged(CharSequence s,
int start, int count, int after)
{
// Abstract Method of TextWatcher Interface.
}
public void onTextChanged(CharSequence s,
int start, int before, int count)
{
textlength = et.getText().length();
array_sort.clear();
for (int i = 0; i < listview_array.length; i++)
{
if (textlength <= listview_array[i].length())
{
if(et.getText().toString().equalsIgnoreCase(
(String)
listview_array[i].subSequence(0,
textlength)))
{
                                                                                                                array_sort.add(listview_array[i]);
                                                                                                }
                                                                                }
                                                                }
lv.setAdapter(new ArrayAdapter<String>
(ListViewSearchExample.this,
android.R.layout.simple_list_item_1, array_sort));
}
});
}
}

还可以查看这些链接...

http://androidsearchfilterlistview.blogspot.in/

http://software-workshop.eu/content/android-development-creating-custom-filter-listview

http://www.mysamplecode.com/2012/07/android-listview-edittext-filter.html

http://androidcocktail.blogspot.in/2012/04/search-custom-listview-in-android.html

于 2012-10-23T07:00:28.947 回答
0

您可以将此功能添加到您的自定义适配器:

@Override 公共过滤器 getFilter() {

        Filter myFilter = new Filter() {

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                // TODO Auto-generated method stub
                if (!m_orders.isEmpty()){
                    clear();
                }

                for (int i = 0; i < tempList.size(); i++) {
                    if(tempList.get(i).getName().toLowerCase().startsWith(constraint.toString().toLowerCase())){
                        add(tempList.get(i));
                    }
                }

                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                // TODO Auto-generated method stub
                return null;
            }
        };  

        return myFilter;
    }

您可以将此过滤器搜索绑定到您的editText:

et_search.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

            m_adapter.getFilter().filter(s, new FilterListener() {

                @Override
                public void onFilterComplete(int count) {
                    // TODO Auto-generated method stub
                    m_adapter.notifyDataSetChanged();
                }
            });
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
                int arg2, int arg3) {

        }

        @Override
        public void afterTextChanged(Editable str) {

        }
    });
于 2012-10-22T15:36:14.827 回答