Метод setChecked () в проверяемом виде запускается дважды каждый раз, когда возится с макетом - PullRequest
2 голосов
/ 18 декабря 2011

Я работал над Cal Poly lab3 (http://sites.google.com/site/androidappcourse/labs/lab-3), и все работало как надо, пока я не пришел к реализации проверяемого интерфейса для развертывания и свертывания элементов. Затем мне показалось, что моя логика была правильной (потому что текст кнопки расширения все еще менялсякак и должно быть) - но раскладка не была перерисована должным образом - как будто она была свернута, когда ее нужно было развернуть и выглядела сломанной.

Поработав немного с логированием, я обнаружил, что каждый раз, когда я нажимаю на любуюМетод setChecked () item вызывается два раза для каждого элемента за очень короткий промежуток времени - что портится с рисунком. Сначала со старыми данными выбора, а затем с новыми.

Более тогоЛюбопытно, что мне удалось исправить проблему, установив, что setChecked () срабатывает только каждый раз:

public void setChecked(boolean checked) 
{
    counter++;
    if (counter%2==0)
    {
        if(checked) expandJokeView();
        else collapseJokeView();
    }
    Log.d("SimpleJokeListLog", "SetChecked"+" "+checked+" "+counter+" "+m_joke.toString());

}

И вот как это выглядит в catlog: я запускаю действие, которое отображает список с элементами вмой пользовательский JokeView, реализующий checkable

12-18 02:58:16.598: D/SimpleJokeListLog(742): SetChecked false 1 A small
12-18 02:58:16.628: D/SimpleJokeListLog(742): SetChecked false 1 Cartoonist
12-18 02:58:16.648: D/SimpleJokeListLog(742): SetChecked false 1 I wonde
12-18 02:58:16.728: D/SimpleJokeListLog(742): SetChecked false 2 A small
12-18 02:58:16.748: D/SimpleJokeListLog(742): SetChecked false 2 Cartoonist
12-18 02:58:16.748: D/SimpleJokeListLog(742): SetChecked false 2 I wondere

Я выбираю первый элемент (маленькийl ...)

12-18 02:59:17.628: D/SimpleJokeListLog(742): SetChecked false 3 A small 
12-18 02:59:17.628: D/SimpleJokeListLog(742): SetChecked false 3 Cartoonis
12-18 02:59:17.628: D/SimpleJokeListLog(742): SetChecked false 3 I wondere
12-18 02:59:17.838: D/SimpleJokeListLog(742): SetChecked true 4 A small boy
12-18 02:59:17.847: D/SimpleJokeListLog(742): SetChecked false 4 Cartoonist
12-18 02:59:17.858: D/SimpleJokeListLog(742): SetChecked false 4 I wondered

Я выбираю второй

12-18 02:59:24.768: D/SimpleJokeListLog(742): SetChecked true 5 A small boy 
12-18 02:59:24.768: D/SimpleJokeListLog(742): SetChecked false 5 Cartoonist 
12-18 02:59:24.768: D/SimpleJokeListLog(742): SetChecked false 5 I wondered w
12-18 02:59:24.968: D/SimpleJokeListLog(742): SetChecked false 6 A small
12-18 02:59:24.968: D/SimpleJokeListLog(742): SetChecked true 6 Cartooni
12-18 02:59:24.978: D/SimpleJokeListLog(742): SetChecked false 6 I wonde

Третий

12-18 02:59:27.828: D/SimpleJokeListLog(742): SetChecked false 7 A small
12-18 02:59:27.838: D/SimpleJokeListLog(742): SetChecked true 7 Cartoonis
12-18 02:59:27.838: D/SimpleJokeListLog(742): SetChecked false 7 I wonder
12-18 02:59:28.048: D/SimpleJokeListLog(742): SetChecked false 8 A small 
12-18 02:59:28.058: D/SimpleJokeListLog(742): SetChecked false 8 Cartooni
12-18 02:59:28.068: D/SimpleJokeListLog(742): SetChecked true 8 I wondered

Снова третий (даже на этот раз без этого счетчиканеправильно рисует):

12-18 02:59:31.197: D/SimpleJokeListLog(742): SetChecked false 9 A small b
12-18 02:59:31.197: D/SimpleJokeListLog(742): SetChecked false 9 Cartoonist
12-18 02:59:31.197: D/SimpleJokeListLog(742): SetChecked true 9 I wondered 
12-18 02:59:31.417: D/SimpleJokeListLog(742): SetChecked false 10 A small bo
12-18 02:59:31.417: D/SimpleJokeListLog(742): SetChecked false 10 Cartoonist f
12-18 02:59:31.427: D/SimpleJokeListLog(742): SetChecked true 10 I wondered why

1 Ответ

3 голосов
/ 18 декабря 2011

Я застрял в этом выпуске последние 3 или 4 часа, в конце я попытался удалить вызовы setChecked () из методов расширения и свертывания (не помню, почему я их туда поместил ...).Может быть, это поможет вам, вот мой фрагмент кода:

private void collapseRow() {
    mText.setMaxLines(2);
    mText.setEllipsize(TruncateAt.MARQUEE);
    mExpand.setText(COllAPS);
    mWiki.setVisibility(GONE);
    requestLayout();
    state = COLLAPSED;


}
private void expandRow() {
    mText.setMaxLines(Integer.MAX_VALUE);
    mText.setEllipsize(null);
    mExpand.setText(EXPAND);
    mWiki.setVisibility(VISIBLE);
    requestLayout();
    state = EXPANDED;

}
private void setData() {
    mText.setText(mItem.getDate());
}

@Override
public boolean isChecked() {
        Log.d("isChecked", "!!!!!!!");
        return mChecked;

}

@Override
public void setChecked(boolean state) {
    count++;

    if (state)
        expandRow();
    else
        collapseRow();

    Log.d("setChecked", ""+ state + "" + count);
}

@Override
public void toggle() {
    Log.d("toggle", "!!!!!!!");
    setChecked(!mChecked);

}

Теперь все работает отлично: нет множественных вызовов setChecked, а ListItems открываются и закрываются, как они должны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...