Проблема с измененным нажатием кнопки адаптера в ListActivity - PullRequest
1 голос
/ 16 ноября 2011

У меня странная проблема с ListActivity, работающим с пользовательским ArrayAdapter. Элементы списка привязаны к данным через настроенный getView и содержат несколько текстовых представлений и кнопку. Когда я нажимаю кнопку элемента, я открываю новое действие в соответствии с нажатой кнопкой Tag, которое содержит идентификатор элемента данных.

Дело в том, иногда щелчок по кнопке определенного элемента фактически выполняет щелчок по щелчку другого элемента, или он выглядит так. Это действительно странно, это действует так, как будто кнопка, которую я нажал, потеряла фокус на другую, которая была нажата вместо этого. При использовании стандартных кнопок я действительно вижу, что есть какой-то беспорядок с фокусировкой на кнопках списка, которые перепрыгивают с одной на другую.

Я не выяснил сценарий, но подозреваю, что он как-то связан с несколькими вызовами getView в фоновом режиме.

это реализация getView моего адаптера:

public View getView(int position, View convertView, ViewGroup parent) 
{
    View v = convertView;
    Context context = App.getContext();
    if (v == null)
    {
        // if the view is empty, init
        v = mInflater.inflate(R.layout.list_item, null);

        // add click listener to the item button
        Button b = (Button)v.findViewById(R.id.b);
        OnClickListener lsn = new OnClickListener() 
        {
            @Override
            public void onClick(View view) 
            {
                // when clicked we want to open the new activity with the selected id
                int id = Integer.parseInt(view.getTag().toString());
                Intent i = new Intent(mActivityContext, otherActivity.class);
                i.putExtra("ID", id);

                mActivityContext.startActivity(i);
            }
        };

        b.setOnClickListener(lsn);
    }

    ItemData currItem = m_Items.get(position);

    // Some fields data bindings to currItem

    Button btn = (Button)v.findViewById(R.id.b);
    btn.setEnabled(currItem.isButtonEnabled);
    btn.setTag(currItem.getID());

    return v;
}

Это мое определение списка на макете:

<ListView android:layout_width="fill_parent" android:id="@+id/android:list" 
          android:fadingEdge="none" android:divider="@color/transparent" android:dividerHeight="2dp" 
          android:background="@color/transparent" android:focusable="false" 
          android:cacheColorHint="@color/transparent" android:layout_height="fill_parent"></ListView>

Есть мысли? Спасибо!


Важное обновление:

После еще нескольких тестов я заметил, что существует некоторая согласованность в отношении того, какой элемент ложно нажимается. это всегда предмет зеркала. т.е. при нажатии на первый элемент в списке, когда я получаю другой элемент, он всегда последний!

например, если в списке 3 элемента, первый и последний иногда относятся друг к другу, но никогда не относятся к среднему элементу, а средний элемент всегда работает, как ожидалось. Как будто где-то есть другой список с обратным порядком элементов, и иногда я получаю индекс зеркала вместо обычного и видимого ...

Это действительно странно! скорее всего, я делаю что-то ужасно неправильно, но я не могу придумать ситуацию, в которой это может произойти.

Я преобразовал адаптер массива в класс, расширяет baseAdapter с помощью arrayList, но поведение продолжается ...

Последнее обновление ... Итак, я обнаружил, что эта проблема возникает, только когда notifyDatasetChanged работает в фоновом режиме. однако я могу уменьшить количество звонков только на 1 каждые 2 секунды. что проблема становится труднее уловить, но она все еще есть ...

ЛЮБАЯ подсказка?

Ответы [ 3 ]

0 голосов
/ 17 ноября 2011

Я согласен с Wizetux относительно использования лучшего имени переменной для вашей переменной convertView, используйте что-то вместо 'v'.

Тем не менее, я также думаю, что вместо переопределения onclick представления, вы могли бы либо вызвать, либо использовать onListItemClick класса ListActivity, который вы расширяете (при условии, что ваш код находится в классе, который расширяет ListActivity)?

0 голосов
/ 17 ноября 2011

Вы должны непосредственно определить onClickListener, так как он объявляется и определяется внутри одного и того же метода.

Кроме того, я не уверен, что определение кнопки и onClickListener для кнопки должны находиться внутри условия «If (v = null)» ...

Пример прямого определения onClickListener вместо использования переменной:

Button b = (Button) v.findViewById (R.id.b);

b.setOnClickListener (new OnClickListener () { @Override public void onClick (View v) { // код onClick } });

0 голосов
/ 17 ноября 2011

Мне интересно, есть ли проблема в вашей функции OnClick.«v» - это то, что вы получаете тег из «v», который определен в определении OnClick, или на основе области действия - это v, которое вы определяете в первой строке функции getView?Попробуйте изменить имя переменной на что-то более понятное для компилятора, и посмотрите, возникает ли такая же проблема.

...