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