Элемент Android ListView invalidate () не перерисовывается - PullRequest
0 голосов
/ 08 июня 2018

В моем приложении для Android у меня есть ListView, который содержит несколько элементов.Для определенных пользовательских вводов (сенсорных событий) бывает, что один элемент в ListView вызывает invalidate () для себя.Проблема в том, что иногда элемент перерисовывается, а иногда нет.Когда он не перерисовывается после вызова invalidate (), мне нужно прокрутить ListView, чтобы получить желаемую перерисовку.Конечно, я этого не хочу.Следует отметить, что я никогда не вызываю listview.invalidate (), а только element.invalidate ().У кого-нибудь есть идеи, как это исправить?

1 Ответ

0 голосов
/ 09 июня 2018

Хорошо, поэтому я нашел свое собственное решение.

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