Grundsätzlich habe ich eine Listenansicht mit jedem Listenelement als (2 Textansichten und ein Kontrollkästchen). Wenn auf ein bestimmtes Listenelement geklickt wird, möchte ich diese Zeile durch eine neue Bearbeitungsansicht und einige Schaltflächen ersetzen. Wie implementiere ich das? Soll ich Integer-Variablen verwenden, um die aktuelle Position des ausgewählten Elements zu speichern und eine andere Ansicht zu laden ODER Action-Bewegungsereignisse verwenden, um die aktuell ausgewählten Elemente zu erhalten?Wie in-Place-Bearbeitung in Android-Listenansicht zu tun?
Antwort
Eine mögliche Lösung wäre, dass Ihre row.xml-Datei beides (2 Textansichten und ein Kontrollkästchen) und (EditText + einige Buttons) enthält, aber EditText und Buttons standardmäßig auf android:visibility="gone"
setzen Dann könnten Sie ein onItemClickListener() für setzen das ListView, das view.setVisibility() in den richtigen Ansichten aufruft, um sie sichtbar/unsichtbar zu machen. Dies würde dem Benutzer so erscheinen, als würden die neuen Elemente die alten in dieser Zeile der Liste ersetzen.
EditViews werden tatsächlich von TextView subclassiert, so dass Sie eigentlich überall einen EditText verwenden können, und dann edditable = true \ false abhängig von Ihren Bedürfnissen einstellen.
Nur eine andere mögliche Lösung, aber Tims Antwort ist auch angemessen.
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MyAdapter myAdapter = (MyAdapter) parent.getAdapter();
MyItem myItem = (MyItem) myAdapter.getItem(position);
myItem.setSelected(true); // set selected flag
// notify the data has been changed and the view should refresh itself
myAdapter.notifyDataSetChanged();
// you can obtain the item view type by calling
// myAdapter.getItemViewType(position);
...
}
Jetzt getViewTypeCount()
, getItemViewType()
und getView()
Methoden in Ihrem Adapter außer Kraft setzen:
Ihre onItemClick()
sollte wie folgt aussehen
class MyAdapter extends ArrayAdapter<MyItem> {
private LayoutInflater mInflater;
private static final int VIEW_ITEM_NORMAL = 0;
private static final int VIEW_ITEM_SELECTED = 1;
...
@Override
public int getItemViewType(int position) {
return getItem(position).isSelected() ? VIEW_ITEM_SELECTED : VIEW_ITEM_NORMAL;
// implement isSelected()
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
int layoutId;
int viewType = getItemViewType(position);
if (v == null) {
switch (viewType) {
case VIEW_ITEM_NORMAL:
layoutId = R.layout.list_item;
break;
case VIEW_ITEM_SELECTED:
layoutId = R.layout.list_item_selected;
break;
default:
layoutId = R.layout.list_item;
break;
}
v = mInflater.inflate(layoutId, parent, false);
} else {
v = convertView;
}
...
Wenn nur ein Element der Ansicht, in der gleichen Zeit ändern können, Es ist besser, das ausgewählte Flag in Ihrem Adapter zu speichern:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MyAdapter myAdapter = (MyAdapter) parent.getAdapter();
myAdapter.setSelected(position);
myAdapter.notifyDataSetChanged();
...
}
class MyAdapter extends ArrayAdapter<MyItem> {
private int mSelected = -1;
...
public void setSelected(int position) {
mSelected = position;
}
@Override
public int getItemViewType(int position) {
return (mSelected == position) ? VIEW_ITEM_SELECTED : VIEW_ITEM_NORMAL;
}
...
Vergessen Sie nicht, das ViewHolder-Muster anzuwenden, das Sie z. here.
Danke @biegleux. Ihre Lösung, das ausgewählte Element für den Adapter zu setzen, hat funktioniert :) :) – mayuri
- 1. Wie zu tun! in Rubin?
- 2. mit Monaden zu tun, um Transformationen in Masse zu tun?
- 3. Wie interaktive SMS zu tun?
- 4. wie zu tun enthält R
- 5. Wie bubble plot zu tun?
- 6. wie Streuung zu tun/Operationen in numpy
- 7. Wie HTTP-Authentifizierung in Android zu tun?
- 8. Wie TOS/DSCP in Rubin zu tun?
- 9. Wie Socket-Kommunikation in Android zu tun?
- 10. In PHP wie Session-Instanzen zu tun?
- 11. Wie zu tun genetische Operationen in Matlab
- 12. Wie bedingte Aggregation in Postgres zu tun?
- 13. wie so etwas in sqlalchemy zu tun?
- 14. wie anonyme Vektor in R zu tun?
- 15. Wie in Schienen äußere Verknüpfung zu tun
- 16. Wie Ereignisse in Ruby zu tun?
- 17. wie zu tun Variable + 1 in iReport
- 18. Wie LINKS in LINQ richtig zu tun?
- 19. Wie in der Anlegestelle Housekeeping zu tun?
- 20. Wie JavaScript Introspektion zu tun?
- 21. Wie zu tun, Textur-Änderung
- 22. NodeJS, wie GDB Debugging zu tun mit
- 23. wie mit Schienen-Routing zu tun
- 24. ParallelOptions.MaxDegreeOfParallelism nichts zu tun
- 25. Python Suche: wie es zu tun effizient
- 26. ASP.NET: wie nur serverseitige Validierung zu tun?
- 27. Wie foreach innerhalb INSERT zu tun?
- 28. Wie eine Funktion zu tun, die
- 29. Wie Dependency Injection Python-Weg zu tun?
- 30. wie zu tun Nummer String Suffix
Danke für Ihre Antwort. Ja, ich kann mit der Sichtbarkeit spielen, aber ich muss immer noch die Position des ausgewählten Listenelements speichern, um zu wissen, an welcher Position die Sichtbarkeit geändert werden muss. – mayuri