2015-11-26 6 views
13

के साथ एंड्रॉइड डेटा बाध्यकारी मैं एक कस्टम एडाप्टर और एक सूची दृश्य के साथ Android's Data Binding features का उपयोग करने की कोशिश कर रहा हूं। मैं कस्टम एडाप्टर के getView विधि अधिभावी समस्या हो रही है:कस्टम एडाप्टर

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() 

बाध्यकारी के साथ जुड़े लेआउट फ़ाइल में सबसे बाहरी दृश्य देता है। यदि यह बाध्यकारी मर्ज लेआउट फ़ाइल के लिए है, तो यह विलय टैग में पहली रूट लौटाएगा।

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 आप क्यों देख रहे हैं कि कन्वर्ट व्यू शून्य है या नहीं? – 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 Listrow लेआउट का उदाहरण है और आपको कन्वर्ट व्यू पर टैग सेट करना चाहिए और अन्य भाग में भी जाना चाहिए। –

1

के लिए यहां पूरा करता kotlin संस्करण है:

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

    return binding.root 
संबंधित मुद्दे