2015-11-26 28 views
13

Ich versuche Android's Data Binding features mit einem benutzerdefinierten Adapter und einem ListView zu verwenden. Ich habe Probleme beim Überschreiben der getView Methode des benutzerdefinierten Adapter:Android Datenbindung mit benutzerdefinierten Adapter

public class ChecksAdapter extends ArrayAdapter<Check> { 

    public ChecksAdapter(Context context, ObservableList<Check> checks) { 
     super(context, R.layout.check, checks); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     CheckBinding binding = DataBindingUtil.inflate(
       LayoutInflater.from(getContext()), 
       R.layout.check, parent, false); 
     binding.setCheck(this.getItem(position)); 

     // Return what? 
    } 

} 

Also meine Fragen sind:

  • Wo bekomme ich das View Element, das ich wiederkommen sollte? Oder mit anderen Worten, wie kann ich das Objekt an eine aufgeblasene/konvertierte Ansicht binden?
  • Wie kann ich convertView wiederverwenden, wenn Datenbindung verwendet wird?
  • Ist dies der richtige Weg, dies zu implementieren? Der Leitfaden ist nicht ganz klar auf Listviews

Hier ist die einzige Referenz von Listviews in der Führung:

Wenn Sie die Datenbindung Elemente in einem Listview oder RecyclerView-Adapter verwenden, können Sie verwenden möchten:

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); 
    //or 
    ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false); 

Antwort

9

nach this, sollten Sie binding.getRoot() zurück.

View getRoot() 

Gibt die äußerste Ansicht in der Layoutdatei mit dem Binding verbunden. Wenn diese Bindung für eine Zusammenführungslayoutdatei verwendet wird, wird das erste Stammverzeichnis in dem Zusammenführungskennzeichen zurückgegeben.

17

Sie sollten jedoch die folgenden für smooth scrolling tun ..

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    CheckBinding binding; 
    if(convertView == null) { 
     binding = DataBindingUtil.inflate(
       LayoutInflater.from(getContext()), 
       R.layout.check, parent, false); 
     convertView = binding.getRoot(); 
    } 
    else { 
     binding = (CheckBinding) convertView.getTag(); 
    } 

    binding.setCheck(this.getItem(position)); 
    convertView.setTag(binding); 
    return convertView; 
} 
+0

ich weiß nicht, warum, aber das ist funktioniert nicht für mich, wenn ich einen Cursor-Adapter verwende –

+2

@AmanSinghal welchen Fehler bekommen Sie? – sergi

+0

@sergi warum überprüfen Sie, ob die convertView null ist? – Thalatta

0
ItemTickFilterBinding mFilterBinding; 

    if (convertView==null) { 
     mFilterBinding= DataBindingUtil.inflate(
       LayoutInflater.from(mContext), 
       R.layout.item_tick_filter, parent, false); 
     convertView.setTag(mFilterBinding); 
    } 
    else { 
     mFilterBinding=(ItemTickFilterBinding)convertView.getTag(); 
    } 
+1

Sie sollten Ihre Antwort zu erklären ... – hering

+0

in der Basis-Adapter-Methode getView .mFilterBinding ist die Instanz von listrow Layout und Sie sollten Tag in der Ansicht zu konvertieren und in anderen Teil auch. –

1

Für vervollständigt hier die Kotlin Variante:

val binding = convertView?.tag as? CheckBinding ?: CheckBinding.inflate(layoutInflater, parent, false) 
    binding.check = this.getItem(position) 
    binding.root.tag = binding 

    return binding.root 
Verwandte Themen