List Filter Custom Adapter dont give result

匿名 (未验证) 提交于 2019-12-03 02:11:02

问题:

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 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!