Android ListView元素invalidate()不重绘

时间:2018-06-07 21:31:43

标签: android listview invalidation redraw

在我的Android应用程序中,我有一个包含多个元素的ListView。对于某些用户输入(触摸事件),会发生ListView中的一个元素调用invalidate()本身。问题是,有时,元素会自行重绘,有时则不重绘。当在调用invalidate()之后它没有重绘时,我需要滚动ListView以获得所需的重绘。当然,我不想要那样。 值得一提的是,我从不调用listview.invalidate(),而只调用element.invalidate()。有没有人知道如何解决这个问题?

2 个答案:

答案 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,一切都会顺利进行。