2012-05-10 26 views
14

Estoy tratando de filtrar una vista de lista con arrayadapter. El parámetro arraydapter es una cadena [] []. El problema es que todo sucede. Debo anular la interfaz de filtro? En ese caso, ¿alguien puede dar algunas pistas?Filter ListView con arrayadapter

Cada posición de la matriz que estoy tratando de filtro es como

galleryValues[0][0] -> "tiulo" 
       [0][1] -> "desc" 
       [0][2] -> "etc" 

I tryied filtrarlo:

lstContinente = (ListView)findViewById(R.id.list); 
lstContinente.setTextFilterEnabled(true); 
adapter = new PortaitArrayAdapter(cx,galleryValues); 
lstContinente.setAdapter(adapter); 

ed_busqueda.addTextChangedListener(new TextWatcher() {   
    public void afterTextChanged(Editable s) {}  
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    // TODO Auto-generated method stub  
}   
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    adapter.getFilter().filter(s.toString()); 
    adapter.notifyDataSetChanged();     
}   
}); 

El código de adaptador:

public class PortaitArrayAdapter extends ArrayAdapter<String> { 
    private final Context context; 
    private final String[][] values; 
    private List<Imagen> imagenes = null; 
    private LayoutInflater mInflater; 
    public ImageLoader imageLoader;  


    public PortaitArrayAdapter(Context context, String[][] values) { 
     super(context, R.layout.gallery_row); 
     this.context = context; 
     this.values = values; 
     mInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     imagenes = new ArrayList<Imagen>(); 
     for (int i = 0; i < 20; i++) imagenes.add(new Imagen()); 
     Bitmap def = BitmapFactory.decodeResource(this.context.getResources(),R.drawable.ic_launcher); 
     imageLoader=new ImageLoader(this.context,def, imagenes); 
    } 



    @Override 
    public int getCount(){ 
     return this.values.length; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 

      convertView = mInflater.inflate(R.layout.gallery_row, parent, false); 
      holder.txtTitulo = (TextView) convertView.findViewById(R.id.txt_gallery_titulo); 
      holder.txtDesc = (TextView) convertView.findViewById(R.id.txt_gallery_desc); 
      holder.txtFecha = (TextView) convertView.findViewById(R.id.txt_gallery_fecha); 
      holder.txtEst = (TextView) convertView.findViewById(R.id.txt_gallery_est); 
      holder.imageView = (ImageView)convertView.findViewById(R.id.lst_img_gallery); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 


     /*LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.gallery_row, parent, false);*/ 

     //ImageView imageView = (ImageView) rowView.findViewById(R.id.icon); 


     Bitmap bmp; 
     Log.v("Position --> ",String.valueOf(position)); 
     try { 
      byte b[] = imagenes.get(position).getImageData(); 
      if (b != null) { 
       bmp = BitmapFactory.decodeByteArray(b, 0, b.length); 
       if (bmp != null) holder.imageView.setImageBitmap(bmp); 
      } else { 

       String urlBase = galleryValues[position][0].substring(0, galleryValues[position][0].lastIndexOf("/")+1); 
       String urlToEncode = galleryValues[position][0].substring(galleryValues[position][0].lastIndexOf("/")+1, galleryValues[position][0].length()); 

       urlToEncode = URLEncoder.encode(urlToEncode,"UTF-8"); 

       String url = urlBase.concat(urlToEncode); 

       url = url.replace("+", "%20"); 
       Log.v("UrlFinal --> ",url); 

       imageLoader.DisplayImage(String.valueOf(position),url,act,holder.imageView, position,null); 
      } 

     } catch (Exception e) { 
      Log.e(this.getClass().getName(),"Exception en pos = " + position + " error:" + e.getMessage()); 
      e.printStackTrace(); 
     } 


     holder.txtTitulo.setText(galleryValues[position][1] + ", " + galleryValues[position][2]); 

     String[] dates = galleryValues[position][4].split("/"); 
     String date = dates [1] + "/" + dates[0] + "/" + dates[2]; 
     Date d1 = new Date(date); 
     DateFormat df = DateFormat.getDateInstance(DateFormat.LONG); 
     holder.txtDesc.setText(galleryValues[position][3]); 

     holder.txtFecha.setText(df.format(d1)); 
     holder.txtEst.setText(getText(R.string.num_fotos_gallery) + galleryValues[position][5] + " - " + getText(R.string.num_videos_gallery) + galleryValues[position][6] + " - " + getText(R.string.num_exp_gallery) + galleryValues[position][7]); 

     return convertView; 
    } 

} 

private static class ViewHolder { 
    TextView txtTitulo; 
    TextView txtDesc; 
    TextView txtFecha; 
    TextView txtEst; 
    ImageView imageView; 
} 
+0

Esto es exactamente mi problema :) – opc0de

+0

Tratando este 'adapter.getFilter(). Filtrar (s.toString(), nuevo Filter.FilterListener() { \t \t public void onFilterComplete (int count) { \t \t Log.d ("FILTER ->", "filtro completo! contar: "+ count); \t \t adapter.notifyDataSetChanged();} \t \t \t \t});' Me di cuenta que el liostener nunca es llamado, tiene el mismo error – user1159489

Respuesta

23

convertir su Arrastre la matriz al ArrayList y páselo a Adapter y use el código siguiente o cambie debajo del código con su String[].

es necesario implementar Filterable a su clase y AdapterOverride getFilter()

Pedido this ejemplo completo para la filtración de encargo Adapter.

public class ListFilterActivity extends ListActivity { 

      private List<String> list = new ArrayList<String>(); 
      List<String> 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<String> 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<String> arrayList;  
      List<String> mOriginalValues; // Original Values 
      LayoutInflater inflater; 

      public MyAdapter(Context context, List<String> arrayList) { 
       this.arrayList = arrayList; 
       inflater = LayoutInflater.from(context); 
      } 

      @Override 
      public int getCount() { 
       return arrayList.size(); 
      } 

      @Override 
      public Object getItem(int position) { 
       return 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<String>) 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<String> FilteredArrList = new ArrayList<String>(); 

         if (mOriginalValues == null) { 
          mOriginalValues = new ArrayList<String>(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 < mOriginalValues.size(); i++) { 
           String data = mOriginalValues.get(i); 
           if (data.toLowerCase().startsWith(constraint.toString())) { 
            FilteredArrList.add(data); 
           } 
          } 
          // set the Filtered result to return 
          results.count = FilteredArrList.size(); 
          results.values = FilteredArrList; 
         } 
         return results; 
        } 
       }; 
       return filter; 
      } 
     } 
    } 
+0

es 'publishResults()' nunca? llamado? – surfer190

0

Aquí que mencionar el código de qué manera se puede filtrar los datos ListView usando adaptador personalizado
Su realmente ayudarle a

ListViewAdapter.java

public class ListViewAdapter extends BaseAdapter { 

    // Declare Variables 
    Context mContext; 
    LayoutInflater inflater; 
    public List<AllFoodItem> allFoodItemlist; 
    public ArrayList<AllFoodItem> arraylist; 

    public ListViewAdapter(Context context, List<AllFoodItem> allFoodItemlist) { 
     mContext = context; 
     this.allFoodItemlist = allFoodItemlist; 
     inflater = LayoutInflater.from(mContext); 
     this.arraylist = new ArrayList<AllFoodItem>(); 
     this.arraylist.addAll(allFoodItemlist); 
    } 
    @Override 
    public int getCount() { 
     return allFoodItemlist.size(); 
    } 

    @Override 
    public AllFoodItem getItem(int position) { 
     return allFoodItemlist.get(position); 
    } 

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

    public class Holder { 
     TextView foodname, quantity, calorie;  
    }  
    public View getView(final int position, View view, ViewGroup parent) { 
     Holder holder = new Holder(); 
     view = inflater.inflate(R.layout.program_list, null); 
     // Locate the TextViews in listview_item.xml 
     holder.foodname = (TextView) view.findViewById(R.id.textView1); 
     // Set the results into TextViews   holder.foodname.setText(allFoodItemlist.get(position).getName().toString());  
     return view; 
    } 

    // Filter Class 
    public void filter(String charText) { 
     charText = charText.toLowerCase(Locale.getDefault()); 
     allFoodItemlist.clear(); 
     if (charText.length() == 0) { 
      allFoodItemlist.addAll(arraylist); 
     } else { 
      for (AllFoodItem wp : arraylist) { 
       if (wp.getName().toLowerCase(Locale.getDefault()).contains(charText)) { 
        allFoodItemlist.add(wp); 
       } 
      } 
     } 
     notifyDataSetChanged(); 
    } 

} 

MainActivity.java

utilizar la clase ListViewAdapter aplicar filtro en EditarTexto por el método() usando el filtro

inputSearch.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
       // When user changed the Text 
       foodname = (inputSearch.getText().toString()).trim(); 

       // filter the data of edit Text using filter method in ListViewAdapter 
       String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault()); 
       adapter.filter(text); 
      } 

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

      } 

      @Override 
      public void afterTextChanged(Editable arg0) { 

       userGet(); 
       // TODO Auto-generated method stub 
      } 
     }); 
+0

Solo incluya el código relevante. Veo algunos TODO y funciones vacías que no es necesario incluir en este sitio. – jhhoff02

Cuestiones relacionadas