android – listview ruft die Artikelansicht nach Position ab

Ich habe Listenansicht mit benutzerdefinierten Adapter (Basisadapter). Ich möchte eine Ansicht von der Listenansicht nach Position erhalten. Ich habe versucht, mListView.getChildAt(position) , aber es funktioniert nicht. Wie kann ich die Artikelansicht nach Position abrufen?

   

Benutze das :

 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); } } 

Sie können nur die sichtbare Ansicht von ListView abrufen, da Zeilenansichten in ListView wiederverwendbar sind. Wenn Sie mListView.getChildAt(0) Sie die erste sichtbare Ansicht. Diese Sicht ist mit dem Element vom Adapter an der Position mListView.getFirstVisiblePosition() .

Die bevorzugte Methode zum Ändern der Darstellung / was auch immer von Zeilenansichten ist, wenn das ListView gezeichnet wird, ist etwas in den Daten zu ändern, aus denen ListView zeichnet (das Array von Objekten, die an Ihren Adapter übergeben werden) und dafür in Ihrem getView () zu berücksichtigen. function, dann zeichnen Sie das ListView neu, indem Sie aufrufen

 notifyDataSetChanged(); 

EDIT: Während es eine Möglichkeit gibt, dies zu tun, tun die Chancen, etwas falsch zu machen. Es gibt zwar einige notifyDataSetChanged() , über die ich nachdenken kann, aber im Allgemeinen ist die Verwendung von notifyDataSetChanged() und anderen eingebauten Mechanismen eine Möglichkeit.

BEARBEITEN 2: Einer der häufigsten Fehler, die Menschen machen, besteht darin, dass sie versuchen, ihren eigenen Weg zu finden, wie der Benutzer auf eine Zeile in der ListView klickt / auswählt, wie in einem der Kommentare zu diesem Beitrag. Es gibt einen bestehenden Weg, dies zu tun. Hier ist wie:

 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 hat viele eingebaute functionen und es gibt keine Notwendigkeit, das Rad für einfachere Fälle neu zu erfinden. Da ListView AdapterView erweitert, können Sie die gleichen Listener wie OnItemClickListener wie im obigen Beispiel festlegen .

 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); } }); 
 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(); } } });