У меня странная проблема с 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 секунды. что проблема становится труднее уловить, но она все еще есть ...
ЛЮБАЯ подсказка?