2013-09-09 7 views
0

У меня есть ListView из более 1000 элементов, этот список можно фильтровать функцией поиска в моем адаптере, при нажатии на элемент он заменяет текущий фрагмент (тот, у которого есть список (A)) с деталью фрагмент (B). Когда пользователь нажимает назад или возвращается к предыдущему фрагменту (B), появляются дубликаты элементов списка.ListAdapter Search Duplicates

Любые идеи?

public class HallsInStateAdapter extends BaseAdapter implements Filterable { 
private Activity activity; 
private ArrayList<HashMap<String, String>> data; 
private ArrayList<HashMap<String, String>> orginalData; 
private static LayoutInflater inflater=null; 
private Filter hallFilter;  

public HallsInStateAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
    activity = a; 
    setData(d); 
    this.orginalData = d; 
} 

public int getCount() { 
    return getData().size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

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



public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    if(convertView==null) 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     vi = inflater.inflate(R.layout.hall_list_view, null); 

    TextView hallName = (TextView)vi.findViewById(R.id.hallName); 
    TextView hallSuburb = (TextView)vi.findViewById(R.id.hallAddress); 
    ImageView hallFavIcon = (ImageView)vi.findViewById(R.id.hallFavouriteIcon); 

    HashMap<String, String> listData = new HashMap<String, String>(); 
    listData = getData().get(position); 

    String address = listData.get(HallsInStateFragment.KEY_HALL_ADDRESS); 
    String suburb = listData.get(HallsInStateFragment.KEY_SUBURB); 
    String state = listData.get(HallsInStateFragment.KEY_STATE); 
    String objectID = listData.get(HallsInStateFragment.KEY_OBJECTID); 

    hallName.setText(address); 
    hallSuburb.setText(suburb + ", " + state); 
    hallFavIcon.setVisibility(View.INVISIBLE); 

    boolean isFavourite = false; 

    DatabaseHandler db = new DatabaseHandler(activity); 
    List<Favourite> favs = db.getAllFavourites(); 
    for (int i = 0; i < favs.size(); i++){ 

     if(favs.get(i).getObjectId().equals(objectID)){ 
      isFavourite = true;   
      break; 
     } 
     else { 
      isFavourite = false; 
     } 

    } 
    db.close(); 

    if (isFavourite == true){ 
     hallFavIcon.setVisibility(View.VISIBLE); 
    } 
    return vi; 
} 

public android.widget.Filter getFilter() { 
    if (hallFilter == null) 
     hallFilter = new HallFilter(); 

    return hallFilter; 
} 


public ArrayList<HashMap<String, String>> getData() { 
    return data; 
} 

public void setData(ArrayList<HashMap<String, String>> data) { 
    this.data = data; 
} 


private class HallFilter extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     FilterResults results = new FilterResults();   

     // We implement here the filter logic 
     if (constraint == null || constraint.length() == 0) { 
      // No filter implemented we return all the list 
      results.values = orginalData; 
      results.count = orginalData.size(); 
     } 
     else { 
      // We perform filtering operation 
      final ArrayList<HashMap<String, String>> filteredLocations = new ArrayList<HashMap<String, String>>(); 

      for (int i = 0; i < orginalData.size(); i ++) { 

       HashMap<String, String> halls = new HashMap<String, String>(); 
       halls.put(HallsInStateFragment.KEY_OBJECTID, orginalData.get(i).get(HallsInStateFragment.KEY_OBJECTID)); 
       String name = orginalData.get(i).get(HallsInStateFragment.KEY_NAME); 
       String prefix = orginalData.get(i).get(HallsInStateFragment.KEY_PREFIX); 
       String address = null; 

       if(prefix == null || prefix.length() == 0){ 
        address = name; 
       } 
       else { 
        address = prefix + " " + name; 
       } 


       halls.put(HallsInStateFragment.KEY_NAME, name); 
       halls.put(HallsInStateFragment.KEY_PREFIX, prefix); 
       halls.put(HallsInStateFragment.KEY_HALL_ADDRESS, address); 
       halls.put(HallsInStateFragment.KEY_STREET, orginalData.get(i).get(HallsInStateFragment.KEY_STREET)); 
       halls.put(HallsInStateFragment.KEY_SUBURB, orginalData.get(i).get(HallsInStateFragment.KEY_SUBURB)); 
       halls.put(HallsInStateFragment.KEY_STATE, orginalData.get(i).get(HallsInStateFragment.KEY_STATE)); 
       halls.put(HallsInStateFragment.KEY_POSTCODE, orginalData.get(i).get(HallsInStateFragment.KEY_POSTCODE)); 
       halls.put(HallsInStateFragment.KEY_LATITUDE, orginalData.get(i).get(HallsInStateFragment.KEY_LATITUDE)); 
       halls.put(HallsInStateFragment.KEY_LONGITUDE, orginalData.get(i).get(HallsInStateFragment.KEY_LONGITUDE)); 
       halls.put(HallsInStateFragment.KEY_TYPE, orginalData.get(i).get(HallsInStateFragment.KEY_TYPE)); 

       String query = constraint.toString().toLowerCase(); 
       String suburb = orginalData.get(i).get(HallsInStateFragment.KEY_SUBURB); 
       if(name == null || name.length() == 0){ 
        Log.e("SGL", "NULL"); 
       } 
       else { 
        if (name.toLowerCase().contains(query) || suburb.toLowerCase().contains(query)) { 
         Log.i("SGL-QUERY", query); 
         filteredLocations.add(halls); 

        } 
       } 

      results.values = filteredLocations; 
      results.count = filteredLocations.size(); 

      } 
     } 
     return results; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 

     //Now we have to inform the adapter about the new list filtered 
     if (results.count == 0) 
      notifyDataSetInvalidated(); 
     else { 
      setData((ArrayList<HashMap<String, String>>) results.values); 
      notifyDataSetChanged(); 
     } 

    } 

} 
} 

ответ

1

Да, перед заполнением списка вашего массива, очистить ArrayList так Последний добавленные данные будут аннулированы и eveytime она будет загружать новые данные в вашем ArrayList.

Примечание. Аррайалист, который вы заполняете перед тем, как перейти к адаптеру, чтобы заполнить ваш список. Надеюсь, что это имеет смысл