2015-11-26 5 views
13

Я пытаюсь использовать Android's Data Binding features с пользовательским адаптером и ListView. У меня возникли проблемы перекрывая getView метода пользовательского адаптера:привязка данных Android к пользовательскому адаптеру

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

} 

Так что мои вопросы:

  • Где я могу получить View элемент, который я должен возвращающимся? Или, другими словами, как я могу привязать объект к завышенному/преобразованному представлению?
  • Как я могу использовать convertView при использовании привязки данных?
  • Это правильный способ реализовать это? Руководство не очень понятно, на ListViews

Вот только ссылка ListViews в руководстве:

Если вы используете привязки данных элементов внутри ListView или RecyclerView адаптера, вы можете предпочесть использовать:

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

ответ

9

Согласно this, вы должны вернуть binding.getRoot().

View getRoot() 

Возвращает самый наружный вид в файле макета, связанного с Binding. Если это привязка для файла компоновки слияния, это вернет первый корень в теге слияния.

17

Вы должны сделать следующее для плавной прокрутки, хотя ..

@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

я не знаю, почему, но это не работает для меня, когда я использую адаптер курсора –

+2

@AmanSinghal, какую ошибку вы получаете? – sergi

+0

@sergi Почему вы проверяете, является ли convertView нулевым? – 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

Вы должны объяснить свой ответ ... – hering

+0

в методе базового адаптера getView .mFilterBinding - это экземпляр макета списка, и вы должны установить тег для конвертирования и получить еще часть. –

1

Для завершения здесь вариант Котлин:

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

    return binding.root 
Смежные вопросы