У меня есть listview с пользовательским адаптером (базовый адаптер). Я хочу получить представление из списка по позиции. Я пробовал mListView.getChildAt(position)
, но он не работает. Как я могу получить просмотр позиции по позиции?
Android - listview получить просмотр позиции по позиции
Ответ 1
Используйте это:
public View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition ) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
Ответ 2
Вы можете получить только видимый вид из ListView, потому что представления строк в ListView повторно используются. Если вы используете mListView.getChildAt(0)
, вы получаете первый видимый вид. Это представление связано с элементом из адаптера в позиции mListView.getFirstVisiblePosition()
.
Ответ 3
Предпочтительный способ изменения внешнего вида/любого вида представлений строк после рисования ListView заключается в том, чтобы что-то изменить в элементе данных ListView (массив объектов, передаваемых в ваш адаптер), и не забудьте указать это в своем getView(), затем перерисуйте ListView, вызвав
notifyDataSetChanged();
РЕДАКТИРОВАТЬ: пока есть способ сделать это, если вам нужно сделать это, вы делаете что-то неправильно. Пока я вижу несколько краевых случаев, обычно использую notifyDataSetChanged()
, а другие встроенные механизмы - это путь.
РЕДАКТИРОВАТЬ 2: Одна из распространенных ошибок, которые люди делают, пытается придумать свой собственный способ ответить на щелчок пользователя/выбор строки в ListView, как в одном из комментариев к этому сообщению. Существует существующий способ сделать это. Вот как:
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
/* Parameters
parent: The AdapterView where the click happened.
view: The view within the AdapterView that was clicked (this will be a view provided by the adapter)
position: The position of the view in the adapter.
id: The row id of the item that was clicked. */
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//your code here
}
});
ListView имеет множество встроенных функций, и нет необходимости изобретать колесо для более простых случаев. Поскольку ListView extends AdapterView, вы можете установить одинаковые Слушатели, такие как OnItemClickListener, как в приведенном выше примере.
Ответ 4
Listview lv = (ListView) findViewById(R.id.previewlist);
final BaseAdapter adapter = new PreviewAdapter(this, name, age);
confirm.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
View view = null;
String value;
for (int i = 0; i < adapter.getCount(); i++) {
view = adapter.getView(i, view, lv);
Textview et = (TextView) view.findViewById(R.id.passfare);
value=et.getText().toString();
Toast.makeText(getApplicationContext(), value,
Toast.LENGTH_SHORT).show();
}
}
});