在我的Android应用程序中,我有一个包含多个元素的ListView。对于某些用户输入(触摸事件),会发生ListView中的一个元素调用invalidate()本身。问题是,有时,元素会自行重绘,有时则不重绘。当在调用invalidate()之后它没有重绘时,我需要滚动ListView以获得所需的重绘。当然,我不想要那样。 值得一提的是,我从不调用listview.invalidate(),而只调用element.invalidate()。有没有人知道如何解决这个问题?
答案 0 :(得分:0)
好吧,所以我找到了自己的解决方案。
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()
然后以不同的方式解决它。例如。如果HorizontalScrollView
内有ListView
,则需要修复:
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;
}
});
}
}
答案 1 :(得分:0)
随着年龄的增长,我们变得更加明智。我的问题是我没有在适配器的convertView
方法中使用getView
,而是将所有视图保留在ArrayList中。坏习惯,女士们和男士们。使用convertView
,一切都会顺利进行。