Ich habe Listenansicht mit benutzerdefiniertem Adapter (Basisadapter). Ich möchte die Ansicht von der Listenansicht nach Position erhalten. Ich habe es versucht mListView.getChildAt(position)
, aber es funktioniert nicht. Wie kann ich die Artikelansicht nach Position abrufen?
69
listView.getChildAt(pos - listView .getFirstVisiblePosition());
abrufen <Position ist die Position, auf die Sie geklickt haben) Ändern Sie die Ansicht und rufen SierefreshDrawableState()
diese Ansicht auf, um sie zu aktualisieren. Einfach :)Antworten:
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); } }
quelle
Sie können nur eine sichtbare Ansicht von ListView erhalten, da Zeilenansichten in ListView wiederverwendbar sind. Wenn Sie verwenden, erhalten
mListView.getChildAt(0)
Sie erste sichtbare Ansicht. Diese Ansicht ist dem Element vom Adapter an Position zugeordnetmListView.getFirstVisiblePosition()
.quelle
Die bevorzugte Methode zum Ändern des Erscheinungsbilds / der Zeilenansichten nach dem Zeichnen der ListView besteht darin, etwas an den Daten zu ändern, aus denen ListView zeichnet (das Array von Objekten, das an Ihren Adapter übergeben wird), und dies in Ihrem getView () zu berücksichtigen. Funktion, dann zeichnen Sie die ListView durch Aufrufen neu
notifyDataSetChanged();
BEARBEITEN: Es gibt zwar eine Möglichkeit, dies zu tun, aber wenn Sie dies tun müssen, machen Sie wahrscheinlich etwas falsch. Während es nur wenige Randfälle gibt, über die ich nachdenken kann, ist die Verwendung
notifyDataSetChanged()
und anderer eingebauter Mechanismen im Allgemeinen ein guter Weg.BEARBEITEN 2: Einer der häufigsten Fehler, den Menschen machen, besteht darin, einen eigenen Weg zu finden, um auf das Klicken / Auswählen einer Zeile in der ListView durch den Benutzer zu reagieren, 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 verfügt über viele integrierte Funktionen und es ist nicht erforderlich, das Rad für einfachere Fälle neu zu erfinden. Da Listview erweitert AdapterView , können Sie die gleichen Hörer, wie Set OnItemClickListener wie im Beispiel oben.
quelle
refreshDrawableState()
, um es zu aktualisieren :)listView.getChildAt(pos - listView .getFirstVisiblePosition());
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); } });
quelle
Dies ist die Kotlin-Version der von VVB geposteten Funktion. Ich habe es im ListView-Adapter verwendet, um die Funktion "Zur nächsten Zeile zuerst EditText wechseln, wenn die Eingabetaste beim letzten EditText der aktuellen Zeile gedrückt wird" in getView () zu implementieren.
Fügen Sie in der ListViewAdapter-Klasse, fun getView (), lastEditText.setOnKeyListner wie folgt hinzu:
lastEditText.setOnKeyListener { v, keyCode, event -> var setOnKeyListener = false if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_UP) { try { val nextRow = getViewByPosition(position + 1, parent as ListView) as LinearLayout val nextET = nextRow.findViewById(R.id.firstEditText) as EditText nextET.isFocusableInTouchMode = true nextET.requestFocus() } catch (e: Exception) { // do nothing } setOnKeyListener = true } setOnKeyListener }
Fügen Sie den Spaß getViewByPosition () nach dem Spaß getView () wie folgt hinzu:
private fun getViewByPosition(pos: Int, listView: ListView): View? { val firstListItemPosition: Int = listView.firstVisiblePosition val lastListItemPosition: Int = firstListItemPosition + listView.childCount - 1 return if (pos < firstListItemPosition || pos > lastListItemPosition) { listView.adapter.getView(pos, null, listView) } else { val childIndex = pos + listView.headerViewsCount - firstListItemPosition listView.getChildAt(childIndex) } }
quelle
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(); } } });
quelle