2016-10-17 2 views
1

В моем приложении, отображающем данные из файла CSV плавно. Но не удалось добавить функцию поиска. Любая помощь будет принята с благодарностью.ArrayAdapter Search Не работает

Как я могу реализовать getFilter().filter(s.toString())?

В главном Java Class:

search_edit.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // Call back the Adapter with current character to Filter 
      mAdapter.getFilter().filter(s.toString()); 


     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count,int after) { 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }); 

Мой адаптер:

public class CSVAdapter extends ArrayAdapter<State> { 
    Context ctx; 
    private static LayoutInflater inflater=null; 


    public CSVAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 

     this.ctx = context; 
     inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     loadArrayFromFile(); 
    } 

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


     View rowView; 
     rowView = inflater.inflate(R.layout.city_element, null); 

     TextView city_name_txtObj=(TextView)rowView.findViewById(R.id.city_name_txt); 
     city_name_txtObj.setText(getItem(pos).getName()); 

     return rowView; 
    } 


    private void loadArrayFromFile(){ 
     try { 
      // Get input stream and Buffered Reader for our data file. 
      InputStream is = null; 
      try { 
       is = ctx.getAssets().open("area.csv"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
      String line; 

      //Read each line 
      while ((line = reader.readLine()) != null) { 

       //Split to separate the name from the capital 
       String[] RowData = line.split(","); 

       //Create a State object for this row's data. 
       State cur = new State(); 
       cur.setName(RowData[1]); 
       cur.setPin(RowData[2]); 
       cur.setLocation(RowData[3]); 
       cur.setLatitude(RowData[4]); 
       cur.setLongitude(RowData[5]); 

       //Add the State object to the ArrayList (in this case we are the ArrayList). 
       this.add(cur); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 


} 

государственный мой класс модели:

public class State { 

    private String name,pinCode,location,latitude,longitude; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getPin() { return pinCode;} 
    public void setPin(String pinCode) { 
     this.pinCode = pinCode; 
    } 

    public String getLocation() { return location;} 
    public void setLocation(String location) { 
     this.location = location; 
    } 

    public String getLatitude() { return latitude;} 
    public void setLatitude(String latitude) { 
     this.latitude = latitude; 
    } 

    public String getLongitude() { return longitude;} 
    public void setLongitude(String longitude) { 
     this.longitude = longitude; 
    } 


} 

Может быть, этот вопрос слишком простой, но я сделал» t найти подходящее решение. Пожалуйста, помогите мне.

+0

попробовать это один http://stackoverflow.com/questions/14118309/how -to-use-search-functional-in-custom-list-view-in-android/14119383 # 14119383 –

+0

@Ganesh уже пытался. – Kankana

ответ

0

Для фильтрации необходимо реализовать Filterable также необходимо создать две копии данных

public class CSVAdapter extends ArrayAdapter<State> implements Filterable { 


@Override 
public Filter getFilter() { 
    if (valueFilter == null) { 
     valueFilter = new ValueFilter(); 
    } 
    return valueFilter; 
} 

private class ValueFilter extends Filter { 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     FilterResults results = new FilterResults(); 

     if (constraint != null && constraint.length() > 0) { 
      ArrayList<Country> filterList = new ArrayList<Country>(); 
      for (int i = 0; i < mStringFilterList.size(); i++) { 
       if ((mStringFilterList.get(i).getName().toUpperCase()) 
         .contains(constraint.toString().toUpperCase())) { 

        Country country = new Country(mStringFilterList.get(i) 
          .getName() , mStringFilterList.get(i) 
          .getIso_code() , mStringFilterList.get(i) 
          .getFlag()); 

        filterList.add(country); 
       } 
      } 
      results.count = filterList.size(); 
      results.values = filterList; 
     } else { 
      results.count = mStringFilterList.size(); 
      results.values = mStringFilterList; 
     } 
     return results; 

    } 

    @Override 
    protected void publishResults(CharSequence constraint, 
      FilterResults results) { 
     countrylist = (ArrayList<Country>) results.values; 
     notifyDataSetChanged(); 
    } 

Для полного примера Visit

Смежные вопросы