LeakCanary сообщает об утечках в обработчиках кликов:
@Override
protected void setupAdapter(CatalogAdapter adapter) {
adapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener<Item>()
{
@Override
public void onClick(View view, Item item, int position) {
// Утечка, как я понял, происходит из-за getContext(), даже если никаких нажатий не происходит. Возможно я ошибаюсь и проблема где-то в другом месте.
Intent intent = new Intent(getContext(), ShowActivity.class);
intent.putExtra(KEY_ITEM, Parcels.wrap(item));
startActivity(intent);
}
});
}
Данный метод вызывается в onCreateView:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getLayoutResource(), container, false);
...
setupAdapter(getAdapter());
...
return view;
}
Адаптер создаётся в onCreate:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
...
adapter = createAdapter();
...
}
Код BaseAdapter:
public abstract class BaseAdapter<T, VH extends RecyclerView.ViewHolder> extends PaginationAdapter<T, VH>
{
private List<T> items;
private Context context;
private OnItemClickListener<T> onItemClickListener;
public BaseAdapter(Context ctx) {
items = new ArrayList<>();
context = ctx.getApplicationContext();
}
@Override
public int getItemCount() {
return items.size();
}
public T getItem(int position) {
return items.get(position);
}
public void setOnItemClickListener(OnItemClickListener<T> onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
protected void callOnClick(View view, T item, int position) {
if (onItemClickListener != null) {
onItemClickListener.onClick(view, item, position);
}
}
protected LayoutInflater getLayoutInflater(View view) {
return LayoutInflater.from(view.getContext());
}
protected Context getContext() {
return context;
}
public interface OnItemClickListener<T>
{
void onClick(View view, T item, int position);
}
}
Вот информация, полученная LeakCanary: