I am using the below code for my getView() in BaseAdapter.
When I try to rotate the phone a few times, each time the heap memory is increasing. While I analyzed this in the memory analyser, I found that new TextView's are being created, but the old ones are not being destroyed.
What should I do to fix this?
Full Adapter code:
package in.mypack.ui;
import static in.mypack.Util.getHelper;
import in.mypack.data.MyClass;
import in.mypack.MyMap;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Map.Entry;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter {
    private Filter filter;
    private MyMap<String, MyClass> items;
    private MyMap<String, MyClass> totalItems;
    private Locale locale;
    private LayoutInflater inflater;
    @SuppressWarnings("unused")
    private final String TAG = "MyAdapter";
    public MyAdapter(MyMap<String, MyClass> objects) {
        items = objects;
        inflater = getHelper().getLayoutInflater();
    }
    private static class ViewHolder {
        TextView one, two, three;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item, null);
            holder = new ViewHolder();
            holder.one = (TextView) convertView.findViewById(R.id.one);
            holder.two = (TextView) convertView.findViewById(R.id.two);
            holder.three = (TextView) convertView.findViewById(R.id.three);
            Typeface font = Typeface.createFromAsset(getHelper().getAssets(), getHelper().getString(R.string.font_custom));
            holder.one.setTypeface(font);
            holder.two.setTypeface(font);
            holder.three.setTypeface(font);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
        MyClass myObject = getItem(position);
        holder.one.setText(myObject.getName());
        holder.two.setText(myObject.getInfo());
        holder.three.setText(myObject.getSize());
        addColors(convertView, holder, myObject);
        return convertView;
    }
    private void addColors(View convertView, ViewHolder holder, MyClass myObject) {
        if (myObject.isValid()) {
            convertView.setBackgroundColor(Color.argb(255,225,225,225));
            holder.one.setPaintFlags(holder.one.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
            holder.two.setPaintFlags(holder.one.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
        }
        else {
            convertView.setBackgroundColor(Color.argb(255,185,185,185));
            holder.one.setPaintFlags(holder.one.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
            holder.two.setPaintFlags(holder.one.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        }
    }
    public Filter getFilter() {
        if (filter == null) {
            locale = Locale.getDefault();
            filter = new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence query) {
                    FilterResults results = new FilterResults();
                    if (totalItems == null) {
                        totalItems = new MyMap<String, MyClass>();
                        totalItems.putAll(items);
                    }
                    if (query == null || 0 == query.length()) {
                        results.count = totalItems.size();
                        results.values = totalItems;
                    }
                    else {
                        MyMap<String, MyClass> filteredList = new MyMap<String, MyClass>();
                        MyMap<String, MyClass> containsList = new MyMap<String, MyClass>();
                        int size = totalItems.size();
                        for (int i = 0; i < size; i++) {
                            Entry<String, MyClass> entry = totalItems.getEntry(i);
                            if (entry.getValue().getTitle().toLowerCase(locale).startsWith(query.toString().toLowerCase(locale))) {
                                filteredList.putEntry(entry);
                            } else if (entry.getValue().getTitle().toLowerCase(locale).contains(query.toString().toLowerCase(locale))) {
                                containsList.putEntry(entry);
                            }
                        }
                        filteredList.putAll(containsList);
                        results.count = filteredList.size();
                        results.values = filteredList;
                    }
                    return results;
                }
                @SuppressWarnings("unchecked")
                @Override
                protected void publishResults(CharSequence query, FilterResults results) {
                    items.clear();
                    items.putAll((MyMap<String, MyClass>) results.values);
                    notifyDataSetChanged();
                }
            };
        }
        return filter;
    }
    public void filter(String query) {
        getFilter().filter(query);
    }
    @Override
    public int getCount() {
        return items.size();
    }
    @Override
    public MyClass getItem(int index) {
        return items.get(index);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    public void add(MyClass myObject) {
        items.sortOnPut(myObject.getName(), myObject, MyMap.Sorting.Value);
    }
}
 
     
     
     
     
     
    