2012-05-10 25 views
14

Próbuję filtrować widok listy za pomocą arrayadapter. Parametrem arraydapter jest String [] []. Problem polega na tym, że wszystko się dzieje. Muszę zastąpić interfejs filtru? W takim przypadku, czy ktoś może podać jakieś wskazówki?Lista filtrówView z tablicą Rozdział

Każda pozycja tablicy Próbuję filtra jest jak

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

I tryied aby je filtrować:

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();     
}   
}); 

Kod adapter:

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

To jest dokładnie mój problem :) – opc0de

+0

Trying to 'adapter.getFilter(). Filtrować (s.toString(), nowa Filter.FilterListener() { \t \t public void onFilterComplete (int count) { \t \t Log.d ("filter ->", „filtr zakończona! liczyć: "+ count); \t \t adapter.notifyDataSetChanged(); \t \t} \t \t});' zauważyłem, że liostener nigdy nie jest wywoływana, masz ten sam błąd – user1159489

Odpowiedz

23

konwertować Tablica łańcuchów do ArrayList i przekaż ją do Adapter i użyj poniższego kodu lub zmień poniższy kod z twoim String[].

Trzeba wdrożyć Filterable do klasy Adapter i Override getFilter()

Checkout this kompletnego przykład do filtrowania zwyczaj 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

jest 'publishResults()' kiedykolwiek? o nazwie? – surfer190

0

Tutaj wspominam kod jaki sposób możemy filtrować dane ListView przy użyciu niestandardowych Adapter
jej naprawdę pomóc

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

użyć klasy ListViewAdapter zastosować filtr na EditText stosując filtr metoda()

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

Proszę podać tylko odpowiedni kod. Widzę niektóre TODO i puste funkcje, które nie są konieczne do umieszczenia na tej stronie – jhhoff02