Хорошо, поэтому я нашел свое собственное решение.
public class ListViewCompatibleCustomView extends CustomView
{
private ListView parentListView;
//Constructors go here (just call super, nothing more)
...
@Override
public void invalidate()
{
super.invalidate();
if(parentListView != null)
parentListView.invalidate();
}
public void setParentListView(ListView parentListView)
{
this.parentListView = parentListView;
}
}
В файле макета я использую этот класс вместо класса CustomView.
Несмотря на то, что это реализация для исправления CustomView
, обычно это можно сделать с любым представлением.Очевидно, setParentListView(…)
должен быть вызван после создания представления.Также важно, чтобы когда представление обычно не вызывало invalidate()
, то обходили его другим способом.Например, если в ListView
есть HorizontalScrollView
, это необходимое исправление:
public class ListViewCompatibleHorizontalScrollView extends HorizontalScrollView
{
private ListView parentListView;
public ListViewCompatibleHorizontalScrollView(Context context)
{
super(context);
}
public ListViewCompatibleHorizontalScrollView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public ListViewCompatibleHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
}
public ListViewCompatibleHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
{
super(context, attrs, defStyleAttr, defStyleRes);
}
public void setParentListView(ListView parentListView)
{
this.parentListView = parentListView;
setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View view, MotionEvent motionEvent)
{
boolean res = ListViewCompatibleHorizontalScrollView.super.onTouchEvent(motionEvent);
if(res)
{
ListViewCompatibleHorizontalScrollView.super.invalidate();
ListViewCompatibleHorizontalScrollView.this.parentListView.invalidate();
}
return res;
}
});
}
}