2012-05-10 21 views
14

Tôi đang cố gắng lọc một listview với arrayadapter. Tham số arraydapter là một String [] []. Vấn đề là bất cứ điều gì xảy ra. Tôi phải ghi đè lên giao diện Filter? Trong trường hợp đó, ai đó có thể cung cấp một số gợi ý?Danh sách bộ lọcXem với arrayadapter

Mỗi vị trí của các mảng Tôi đang cố gắng để lọc là như

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

tôi tryied để lọc nó:

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

Mã 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

Đây chính là vấn đề của tôi :) – opc0de

+0

Cố gắng này 'adapter.getFilter(). Lọc (s.toString(), mới Filter.FilterListener() { \t \t void công khai onFilterComplete (int count) { \t \t Log.d ("FILTER ->", "bộ lọc hoàn tất! đếm: "+ count); \t \t adapter.notifyDataSetChanged(); \t \t} \t \t});' Tôi nhận thấy rằng liostener không bao giờ được gọi là, bạn có lỗi tương tự – user1159489

Trả lời

23

Chuyển đổi của bạn Mảng chuỗi thành ArrayList và chuyển nó tới Adapter và sử dụng mã bên dưới hoặc thay đổi bên dưới mã với String[] của bạn.

Bạn cần phải thực hiện Filterable đến lớp Adapter của bạn và Override getFilter()

Thanh toán this ví dụ hoàn chỉnh để lọc tùy chỉnh 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

là 'publishResults() 'bao giờ? được gọi là? – surfer190

0

Đây Tôi đề cập đến các mã như thế nào Chúng tôi có thể lọc dữ liệu ListView sử dụng tùy chỉnh Adaptor
của nó thực sự giúp bạn

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

sử dụng lớp ListViewAdapter áp dụng bộ lọc trên EditText bằng cách sử dụng phương pháp() lọc

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

Vui lòng chỉ bao gồm mã có liên quan. Tôi thấy một số TODO và các chức năng trống không cần thiết để đưa vào trang web này – jhhoff02

Các vấn đề liên quan