EditText用于过滤listview中的项目。如何?

时间:2013-10-24 14:57:31

标签: java android android-listview filter android-edittext

我有一个列表视图,显示我的设备中安装的应用程序。我想创建一个editText来过滤我搜索的项目。我已经创建了edittext但是没有工作,当我输入搜索内容时没有任何内容出现。这是MainActivity:

public class MainActivity extends ListActivity implements OnItemLongClickListener{
    private PackageManager packageManager = null;
    private List<ApplicationInfo> applist = null;
    private ApplicationAdapter listadaptor = null;
    EditText inputSearch;

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

        packageManager = getPackageManager();
        new LoadApplications().execute();

        /** refresh btn*/
        Button bottone1 = (Button)findViewById(R.id.button1);
        bottone1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                new LoadApplications().execute();

            }   
        });
        /** EditText filter */
        // Edit text
        inputSearch = (EditText) findViewById(R.id.editTxt);
        ListView lv = (ListView) findViewById(android.R.id.list);
        lv.setTextFilterEnabled(true);

        inputSearch.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                // Filter when someone type in the edittext
                MainActivity.this.listadaptor.getFilter().filter(cs);   
            }

            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub                          
            }
        });
    };



    private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) {
        ArrayList<ApplicationInfo> applist = new ArrayList<ApplicationInfo>();
        for (ApplicationInfo info : list) {
            try {
                if (null != packageManager.getLaunchIntentForPackage(info.packageName)) {
                    applist.add(info);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return applist;
    }


    private class LoadApplications extends AsyncTask<Void, Void, Void> {        

        public ProgressDialog progress = null;

        @Override
        protected Void doInBackground(Void... params) {
            applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
            listadaptor = new ApplicationAdapter(MainActivity.this,R.layout.snippet_list_row, applist);

            return null;
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }

        protected void onDestroy() {
            if(progress!=null)
                if(progress.isShowing()){
                progress.dismiss();
                }

        }

        @Override
        protected void onPostExecute(Void result) {
            setListAdapter(listadaptor);
            progress.dismiss();
            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {
            progress = ProgressDialog.show(MainActivity.this, null,
                    "Loading...");
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }


    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        // TODO Auto-generated method stub
        return false;
    }

}

适配器编辑:

    public class ApplicationAdapter extends ArrayAdapter<ApplicationInfo>  { 
    private List<ApplicationInfo> appsList = null; 
    private Context context; 
    private PackageManager packageManager; 

    public ApplicationAdapter(Context context, int textViewResourceId, 
            List<ApplicationInfo> appsList) { 
        super(context, textViewResourceId, appsList); 
        this.context = context; 
        this.appsList = appsList; 
        packageManager = context.getPackageManager(); 
    } 

    @Override
    public int getCount() { 
        return ((null != appsList) ? appsList.size() : 0); 
    } 

    @Override
    public ApplicationInfo getItem(int position) { 
        return ((null != appsList) ? appsList.get(position) : null); 
    } 

    @Override
    public long getItemId(int position) { 
        return position; 
    } 

    @Override
    public View getView(int position, View convertView, ViewGroup parent) { 
        View view = convertView; 
        if (null == view) { 
            LayoutInflater layoutInflater = (LayoutInflater) context 
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
            view = layoutInflater.inflate(R.layout.snippet_list_row, null); 
        } 



        ApplicationInfo data = appsList.get(position); 
        if (null != data) { 
            TextView appName = (TextView) view.findViewById(R.id.app_name); 
            TextView packageName = (TextView) view.findViewById(R.id.app_paackage); 
            ImageView iconview = (ImageView) view.findViewById(R.id.app_icon); 

            appName.setText(data.loadLabel(packageManager)); 
            packageName.setText(data.packageName); 
            iconview.setImageDrawable(data.loadIcon(packageManager)); 
        } 
        return view; 
    } 

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                appsList = (List<ApplicationInfo>) results.values;
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();
                ArrayList<String> FilteredArrayNames = new ArrayList<String>();

                // perform your search here using the searchConstraint String.



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



                return results;
            }
        };

        return filter;
    }
};
有人可以帮帮我吗?实际上,当我键入搜索没有任何改变并休息整个列表视图。感谢

2 个答案:

答案 0 :(得分:1)

查看Filterable接口并在Adapter类中实现它。 定义接口的getFilter()方法,该方法将返回适配器中已过滤的列表项。看看以下问题:

List View Filter Android

或使用SearchView

答案 1 :(得分:1)

试试这个

我更改了适配器类

public class ApplicationAdapter extends ArrayAdapter<ApplicationInfo>  { 
    private List<ApplicationInfo> appsList = null; 
    private Context context; 
    private PackageManager packageManager;
    private List<ApplicationInfo> listOfApp;

    public ApplicationAdapter(Context context, int textViewResourceId, 
            List<ApplicationInfo> appsList) { 
        super(context, textViewResourceId, appsList); 
        this.context = context; 
        this.appsList = appsList;
        this.listOfApp = new ArrayList<ApplicationInfo>(); //Added here
        packageManager = context.getPackageManager();
        listOfApp.addAll(appsList);
    } 

    @Override
    public int getCount() { 
        return ((null != appsList) ? appsList.size() : 0); 
    } 

    @Override
    public ApplicationInfo getItem(int position) { 
        return ((null != appsList) ? appsList.get(position) : null); 
    } 

    @Override
    public long getItemId(int position) { 
        return position; 
    } 

    @Override
    public View getView(int position, View convertView, ViewGroup parent) { 
        View view = convertView; 
        if (null == view) { 
            LayoutInflater layoutInflater = (LayoutInflater) context 
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
            view = layoutInflater.inflate(R.layout.snippet_list_row, null); 
        } 

        ApplicationInfo data = appsList.get(position); 
        if (null != data) { 
            TextView appName = (TextView) view.findViewById(R.id.app_name); 
            TextView packageName = (TextView) view.findViewById(R.id.app_paackage); 
            ImageView iconview = (ImageView) view.findViewById(R.id.app_icon); 

            appName.setText(data.loadLabel(packageManager)); 
            packageName.setText(data.packageName); 
            iconview.setImageDrawable(data.loadIcon(packageManager)); 
        } 
        return view; 
    } 

 // Filter Class
    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        appsList.clear();
        if (charText.length() == 0) {
            appsList.addAll(listOfApp);
        } 
        else
        {
            for (ApplicationInfo ai : listOfApp) 
            {
                if (ai.loadLabel(packageManager).toString().toLowerCase(Locale.getDefault()).contains(charText)) 
                {
                    appsList.add(ai);
                }
            }
        }
        notifyDataSetChanged();
    }

}

并更改活动

inputSearch.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
               // I changed here to call filter method from Adapter class.
               String text =inputSearch.getText().toString().toLowerCase(Locale.getDefault());
                listadaptor.filter(text);
            }

            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub                          
            }
        });

希望这对你有所帮助。