可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I m developing app where there is list and above edit text,the moment i will type something in editText i should get the result matching for the typed word.bt i cant get the result,Plz tell where am i making mistake ? Below are my Activity and Adapter.
**Activity**
public class ListFilterActivity extends ListActivity{ ListView list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list_filter); list = getListView(); list.isTextFilterEnabled(); // final ArrayAdapter adapter = new ArrayAdapter(this, // android.R.layout.simple_list_item_1, android.R.id.text1, // getModel()); final CustomAdapter adapter = new CustomAdapter(ListFilterActivity.this, getModel()); setListAdapter(adapter); EditText filterEditText = (EditText) findViewById(R.id.filterText); filterEditText.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { adapter.getFilter().filter(s.toString()); } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void afterTextChanged(Editable s) { } }); } private ArrayList getModel() { ArrayList list = new ArrayList(); list.add("Linux"); list.add("Windows7"); list.add("Suse"); list.add("Eclipse"); list.add("Ubuntu"); list.add("Solaris"); list.add("Android"); list.add("Ayes"); list.add("iPhone"); return list; } }
Adapter***
public class CustomAdapter extends ArrayAdapter { private final Context context; private final ArrayList names; private LayoutInflater mInflater; private TextView txt; public CustomAdapter(Context context, ArrayList names) { super(context, R.layout.row, names); this.context = context; this.names = names; mInflater = LayoutInflater.from(context); } public Filter getFilter() { if(newFilter == null) { newFilter = new Filter() { @Override protected void publishResults(CharSequence constraint, FilterResults results) { // TODO Auto-generated method stub Log.d("TAG", "publishResults"); notifyDataSetChanged(); } @Override protected FilterResults performFiltering(CharSequence prefix) { FilterResults results = new FilterResults(); ArrayList i = new ArrayList(); if (prefix!= null && prefix.toString().length() > 0) { for (int index = 0; index
plz help me out....
回答1:
You need to implement Filterable to your Adapter Class and Override getFilter()
Checkout this complete example for Filtering custom Adapter.
UPDATE:
public class ListFilterActivity extends ListActivity { private List list = new ArrayList(); List mOriginalValues; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final MyAdapter adapter = new MyAdapter(this, getModel()); setListAdapter(adapter); EditText filterEditText = (EditText) findViewById(R.id.filterText); // Add Text Change Listener to EditText filterEditText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // Call back the Adapter with current character to Filter adapter.getFilter().filter(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count,int after) { } @Override public void afterTextChanged(Editable s) { } }); } private List getModel() { list.add("Linux"); list.add("Windows7"); list.add("Suse"); list.add("Eclipse"); list.add("Ubuntu"); list.add("Solaris"); list.add("Android"); list.add("iPhone"); list.add("Windows XP"); return list; } // Adapter Class public class MyAdapter extends BaseAdapter implements Filterable { List arrayList; List mOriginalValues; // Original Values LayoutInflater inflater; public MyAdapter(Context context, List arrayList) { this.arrayList = arrayList; inflater = LayoutInflater.from(context); } @Override public int getCount() { return arrayList.size(); } @Override public Object getItem(int position) { return arrayList.get(position); } @Override public long getItemId(int position) { return position; } private class ViewHolder { TextView textView; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.row, null); holder.textView = (TextView) convertView .findViewById(R.id.textview); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.textView.setText(arrayList.get(position)); return convertView; } @Override public Filter getFilter() { Filter filter = new Filter() { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint,FilterResults results) { arrayList = (List) results.values; // has the filtered values notifyDataSetChanged(); // notifies the data with new filtered values } @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values List FilteredArrList = new ArrayList(); if (mOriginalValues == null) { mOriginalValues = new ArrayList(arrayList); // saves the original data in mOriginalValues } /******** * * If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values * else does the Filtering and returns FilteredArrList(Filtered) * ********/ if (constraint == null || constraint.length() == 0) { // set the Original result to return results.count = mOriginalValues.size(); results.values = mOriginalValues; } else { constraint = constraint.toString().toLowerCase(); for (int i = 0; i
回答2:
You need to override getFilter() in your custom adapter.
回答3:
While Lalit's solution works perfectly, you can implement the SearchView in ActionBar which make your UI fancier. You can get SearchView in your activity as mentioned below -
@Override public boolean onCreateOptionsMenu(Menu menu) { //Create the search view SearchView searchView = new SearchView(getSupportActionBar().getThemedContext()); mListView = getListView(); mListView.setTextFilterEnabled(true); setupSearchView(searchView); menu.add(0, 1, 1, "Search Text") .setIcon(R.drawable.ic_search) .setActionView(searchView) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); return super.onCreateOptionsMenu(menu); } private void setupSearchView(SearchView mSearchView) { mSearchView.setIconifiedByDefault(false); mSearchView.setSubmitButtonEnabled(false); mSearchView.setOnQueryTextListener(this); mSearchView.setQueryHint("Search Text"); } @Override public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { mListView.clearTextFilter(); } else { mListView.setFilterText(newText); } return true; } @Override public boolean onQueryTextSubmit(String query) { return false; }
回答4:
/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.app; import android.content.Context; import android.content.Intent; import android.content.pm.ComponentInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PaintFlagsDrawFilter; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.PaintDrawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Displays a list of all activities which can be performed * for a given intent. Launches when clicked. * */ public abstract class LauncherActivity extends ListActivity { Intent mIntent; PackageManager mPackageManager; IconResizer mIconResizer; /** * An item in the list */ public static class ListItem { public ResolveInfo resolveInfo; public CharSequence label; public Drawable icon; public String packageName; public String className; public Bundle extras; ListItem(PackageManager pm, ResolveInfo resolveInfo, IconResizer resizer) { this.resolveInfo = resolveInfo; label = resolveInfo.loadLabel(pm); ComponentInfo ci = resolveInfo.activityInfo; if (ci == null) ci = resolveInfo.serviceInfo; if (label == null && ci != null) { label = resolveInfo.activityInfo.name; } if (resizer != null) { icon = resizer.createIconThumbnail(resolveInfo.loadIcon(pm)); } packageName = ci.applicationInfo.packageName; className = ci.name; } public ListItem() { } } /** * Adapter which shows the set of activities that can be performed for a given intent. */ private class ActivityAdapter extends BaseAdapter implements Filterable { private final Object lock = new Object(); private ArrayList mOriginalValues; protected final IconResizer mIconResizer; protected final LayoutInflater mInflater; protected List mActivitiesList; private Filter mFilter; public ActivityAdapter(IconResizer resizer) { mIconResizer = resizer; mInflater = (LayoutInflater) LauncherActivity.this.getSystemService( Context.LAYOUT_INFLATER_SERVICE); mActivitiesList = makeListItems(); } public Intent intentForPosition(int position) { if (mActivitiesList == null) { return null; } Intent intent = new Intent(mIntent); ListItem item = mActivitiesList.get(position); intent.setClassName(item.packageName, item.className); if (item.extras != null) { intent.putExtras(item.extras); } return intent; } public ListItem itemForPosition(int position) { if (mActivitiesList == null) { return null; } return mActivitiesList.get(position); } public int getCount() { return mActivitiesList != null ? mActivitiesList.size() : 0; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View view; if (convertView == null) { view = mInflater.inflate( com.android.internal.R.layout.activity_list_item_2, parent, false); } else { view = convertView; } bindView(view, mActivitiesList.get(position)); return view; } private void bindView(View view, ListItem item) { TextView text = (TextView) view; text.setText(item.label); if (item.icon == null) { item.icon = mIconResizer.createIconThumbnail( item.resolveInfo.loadIcon(getPackageManager())); } text.setCompoundDrawablesWithIntrinsicBounds(item.icon, null, null, null); } public Filter getFilter() { if (mFilter == null) { mFilter = new ArrayFilter(); } return mFilter; } /** * An array filters constrains the content of the array adapter with a prefix. Each * item that does not start with the supplied prefix is removed from the list. */ private class ArrayFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence prefix) { FilterResults results = new FilterResults(); if (mOriginalValues == null) { synchronized (lock) { mOriginalValues = new ArrayList(mActivitiesList); } } if (prefix == null || prefix.length() == 0) { synchronized (lock) { ArrayList list = new ArrayList(mOriginalValues); results.values = list; results.count = list.size(); } } else { final String prefixString = prefix.toString().toLowerCase(); ArrayList values = mOriginalValues; int count = values.size(); ArrayList newValues = new ArrayList(count); for (int i = 0; i ) results.values; if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } } } /** * Utility class to resize icons to match default icon size. */ public class IconResizer { // Code is borrowed from com.android.launcher.Utilities. private int mIconWidth = -1; private int mIconHeight = -1; private final Rect mOldBounds = new Rect(); private Canvas mCanvas = new Canvas(); public IconResizer() { mCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG, Paint.FILTER_BITMAP_FLAG)); final Resources resources = LauncherActivity.this.getResources(); mIconWidth = mIconHeight = (int) resources.getDimension( android.R.dimen.app_icon_size); } /** * Returns a Drawable representing the thumbnail of the specified Drawable. * The size of the thumbnail is defined by the dimension * android.R.dimen.launcher_application_icon_size. * * This method is not thread-safe and should be invoked on the UI thread only. * * @param icon The icon to get a thumbnail of. * * @return A thumbnail for the specified icon or the icon itself if the * thumbnail could not be created. */ public Drawable createIconThumbnail(Drawable icon) { int width = mIconWidth; int height = mIconHeight; final int iconWidth = icon.getIntrinsicWidth(); final int iconHeight = icon.getIntrinsicHeight(); if (icon instanceof PaintDrawable) { PaintDrawable painter = (PaintDrawable) icon; painter.setIntrinsicWidth(width); painter.setIntrinsicHeight(height); } if (width > 0 && height > 0) { if (width iconHeight) { height = (int) (width / ratio); } else if (iconHeight > iconWidth) { width = (int) (height * ratio); } final Bitmap.Config c = icon.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; final Bitmap thumb = Bitmap.createBitmap(mIconWidth, mIconHeight, c); final Canvas canvas = mCanvas; canvas.setBitmap(thumb); // Copy the old bounds to restore them later // If we were to do oldBounds = icon.getBounds(), // the call to setBounds() that follows would // change the same instance and we would lose the // old bounds mOldBounds.set(icon.getBounds()); final int x = (mIconWidth - width) / 2; final int y = (mIconHeight - height) / 2; icon.setBounds(x, y, x + width, y + height); icon.draw(canvas); icon.setBounds(mOldBounds); icon = new BitmapDrawable(getResources(), thumb); } else if (iconWidth onQueryPackageManager(Intent queryIntent) { return mPackageManager.queryIntentActivities(queryIntent, /* no flags */ 0); } /** * Perform the query to determine which results to show and return a list of them. */ public List makeListItems() { // Load all matching activities and sort correctly List list = onQueryPackageManager(mIntent); Collections.sort(list, new ResolveInfo.DisplayNameComparator(mPackageManager)); ArrayList result = new ArrayList(list.size()); int listSize = list.size(); for (int i = 0; i