0

我有一个包含 1000 多个项目的 ListView,这个列表可以通过我的适配器中的搜索功能进行过滤,当单击一个项目时,它会将当前片段(带有列表(A)的片段)替换为详细片段(B)。在用户按下或返回到前一个片段 (B) 时,会有重复的列表项。

有任何想法吗??

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

    }

}
}
4

1 回答 1

1

是的,在填充您的列表数组之前,请清除您的数组列表,这样最后添加的数据将是无效的,并且每次它都会在您的数组列表中加载新数据。

注意:您在传递给适配器以填充您的列表视图之前填充的数组列表。希望有意义

于 2013-09-09T12:14:01.230 回答