J'ai Listview avec un adaptateur personnalisé (adaptateur de base). Je veux obtenir une vue de listview par position. J'ai essayé mListView.getChildAt(position)
, mais cela ne fonctionne pas. Comment puis-je obtenir la vue d'article par position?
Utilisez ceci :
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);
}
}
Vous ne pouvez obtenir qu'une vue visible à partir de ListView car les vues de lignes dans ListView sont réutilisables. Si vous utilisez mListView.getChildAt(0)
, vous obtenez une première vue visible. Cette vue est associée à l'article de l'adaptateur en position mListView.getFirstVisiblePosition()
.
Une méthode recommandée pour modifier l'apparence/toutes les vues de ligne une fois que ListView est dessiné consiste à modifier quelque chose dans les données à partir desquelles ListView tire (le tableau d'objets transmis à votre adaptateur) et à en rendre compte dans votre getView (). fonction, puis redessinez le ListView en appelant
notifyDataSetChanged();
EDIT: bien qu'il existe un moyen de faire cela, si vous devez le faire, il y a de fortes chances que vous fassiez quelque chose de mal. Bien que rares soient les cas Edge auxquels je puisse penser, généralement, utiliser notifyDataSetChanged()
et d'autres mécanismes intégrés est une solution.
EDIT 2: L’une des erreurs courantes commises par les utilisateurs est de trouver leur propre façon de répondre lorsque l’utilisateur clique/sélectionne une ligne dans la liste, comme dans l’un des commentaires de ce message. Il existe un moyen de le faire. Voici comment:
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 a beaucoup de fonctionnalités intégrées et il n’est pas nécessaire de réinventer la roue pour des cas plus simples. Étant donné que ListView s'étend AdapterView , vous pouvez définir les mêmes écouteurs, tels que OnItemClickListener comme dans l'exemple ci-dessus.
workignHoursListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,View view, int position, long id) {
viewtype yourview=yourListViewId.getChildAt(position).findViewById(R.id.viewid);
}
});