2012-03-29 8 views
2

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

1

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.

+0

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

2

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:

1

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.

+0

Danke @biegleux. Ihre Lösung, das ausgewählte Element für den Adapter zu setzen, hat funktioniert :) :) – mayuri