2015-11-26 8 views
13

Próbuję użyć Android's Data Binding features z niestandardowym adapterem i listView. Mam problemy z przesłanianie getView metoda niestandardowe adaptera:Powiązanie danych Androida z niestandardowym adapterem

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? 
    } 

} 

Więc moje pytania to:

  • Gdzie mogę dostać element View że powinienem wracać? Lub innymi słowy, w jaki sposób mogę powiązać obiekt z zawyżonym/przekonwertowanym widokiem?
  • Jak mogę ponownie użyć convertView podczas korzystania z powiązania danych?
  • Czy to jest właściwy sposób wdrożenia tego? Przewodnik nie jest bardzo jasne, na ListViews

Oto jedyne odniesienie ListViews w przewodniku:

Jeśli używasz wiążące elementy wewnątrz ListView lub adaptera RecyclerView danych, może wolisz używać:

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

Odpowiedz

9

Według this, należy wrócić binding.getRoot().

View getRoot() 

Zwraca zewnętrzną View w pliku układu związanego z wiążące. Jeśli to powiązanie dotyczy pliku układu scalania, zwróci on pierwszy element główny w znaczniku scalania.

17

należy wykonać następujące czynności na płynne przewijanie chociaż ..

@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

nie wiem dlaczego, ale to jest nie działa dla mnie, gdy używam adaptera kursora –

+2

@AmanSinghal jaki błąd otrzymujesz? – sergi

+0

@sergi dlaczego sprawdzasz, czy convertView ma wartość null? – 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

Powinieneś wyjaśnić swoją odpowiedź ... – hering

+0

w metodzie adaptera bazowego getView .mFilterBinding jest instancją layoutu listrow i powinieneś ustawić znacznik na przekonwertowanym widoku i dostać się również do innej części. –

1

Na ukończeniu jest tu wariant Kotlin:

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

    return binding.root