Вы проблема в том, что представления повторно используются в представлении списка. Это означает, что даже если у вас есть список, состоящий из 100 элементов, будет только 10 или около того экземпляров просмотра (в зависимости от того, сколько можно разместить на экране). Если вы видите, что метод bindView использует представление для повторного использования в качестве параметра.
То, что вы сделали, это вид, который отображает, например, 23-й элемент в списке, и скрывает текстовое поле. Когда 23-й элемент прокручивается за пределы экрана, его представление используется повторно, но только данные 33-го элемента заменяются только значениями, видимость и другие параметры, которые вы задаете для представления, которое вы повторно используете, остаются прежними.
Что вам нужно сделать, это добавить логическое состояние для всех элементов списка и в bindView адаптера переключить видимость текстовых полей в соответствии с текущим требуемым состоянием элемента.
Другая важная вещь, которую нужно увидеть, это то, что при нажатии на элемент метод bindView не вызывается. Таким образом, вы должны также переключить видимость в методе onClick, чтобы сделать изменение мгновенным. Если вы пропустите это, внешний вид представления изменится только после того, как элемент будет прокручен и снова прокручен - тогда bindView проверяет булевость видимости.
Было бы более удобно уведомлять DataSetObservers об изменении в «данных» и позволять ListView вызывать bindView для всех видимых элементов, но он также более ресурсоемкий.
HashMap<Long, Boolean> positionHide = new HashMap<Long, Boolean>();
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Boolean tmp = positionHide.get(id);
if (tmp == null) { // if null we don't have this key in the hashmap so we added with the value true
positionHide.put(id, true);
tmp = true;
} else {
tmp = !tmp.booleanValue();
positionHide.put(id, !tmp.booleanValue()); // if the value exists in the map then inverse it's value
}
// You should also hide the text view, because bindView will not be called until the list item is scrolled out and in again
TextView m_text = (TextView) view.findViewById(R.id.my_text);
if (m_text != null) {
if(tmp) {
// We should hide the text view
m_text.setVisibility(View.GONE);
} else {
// We should display the text view
m_text.setVisibility(View.VISIBLE);
}
}
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
String listText = cursor.getString(cursor
.getColumnIndexOrThrow(DataHandler.MY_TEXT));
TextView m_text = (TextView) view.findViewById(R.id.my_text);
if (m_text != null) {
m_text.setText(listText);
long pos = cursor.getLong(cursor.getColumnIndex(DataHandler.ID)); // DataHandler.ID will point to the column _id
if((positionHide.get(pos) != null)&&(positionHide.get(pos))) {
// We should hide the text view
m_text.setVisibility(View.GONE);
} else {
// We should display the text view
m_text.setVisibility(View.VISIBLE);
}
}
}
Чтобы это работало, в вашей базе данных должен быть столбец _id INTEGER PRIMARY KEY AUTOINCREMENT
(также добавленный в запрос).