एडाप्टर या ViewHolder में कोटलिन सिंथेटिक


84

मैं कोटलिन में नया हूं। मैंने findViewByIdअपनी Activityकक्षा में कष्टप्रद विधि के बजाय सिंथेटिक विधि का उपयोग करने की कोशिश की है , लेकिन मैंने पाया है कि "यदि हम व्यू (सिंथेटिक कक्षाओं में उपयोगी) पर सिंथेटिक गुणों को कॉल करना चाहते हैं, तो हमें kotlinx.android.synthetic.ain भी आयात करना चाहिए ।राय।*।" लेकिन मैं यह पता नहीं लगा सकता कि यह कैसे काम करता है? क्या कोई उदाहरण है?


जवाबों:


96

Https://github.com/antoniolg/Kotlin-for-Android-Developers से सरल उदाहरण

import kotlinx.android.synthetic.item_forecast.view.*

class ForecastListAdapter() : RecyclerView.Adapter<ForecastListAdapter.ViewHolder>() {

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {

        fun bindForecast(forecast: Forecast) {
            itemView.date.text = forecast.date.toDateString()
        }
    }
}

लिखने की जरूरत नहीं

val view = itemView.findViewById(R.id.date) as TextView
view.text = forecast.date.toDateString()

केवल

itemView.date.text = forecast.date.toDateString()

सरल और प्रभावी!


4
ठीक है, यह एक गूंगा प्रश्न हो सकता है, लेकिन 'itemView' संदर्भ कहां से आता है?
शाऊल अगुईर

4
दृश्य एक्सटेंशन के लिए कोई कैश नहीं है, इसलिए विचारों के संदर्भों को कैश किया जाना चाहिए, जैसे कि सामान्य दृश्य फ़ोल्डर में।
Miha_x64

21
दुर्भाग्य से यह प्रत्येक bind पर खोज करने के लिए बुला रहा है। () कॉल: medium.com/proandroiddev/…
मिगुएल बेल्ट्रान

2
@ माइक के बाद से कोटलिन 1.1.4 सभी दृश्य कैश किए जा रहे हैं। व्यूहोल्डर्स में भी। आपके द्वारा पोस्ट किया गया लेख इसका भी उल्लेख करता है।
स्टीफन मेडैक

2
@StefanMedack मैं लेख का लेखक हूँ :) हालाँकि मुझे यह बताना होगा कि यह प्रायोगिक सुविधाओं का केवल एक हिस्सा है और इसे मैन्युअल रूप से सक्षम करने की आवश्यकता है। मैंने अभी तक इसकी कोशिश नहीं की है।
मिगुएल बेलट्रान

37

कोटलिंग 1.1.4

अधिक जानकारी: https://antonioleiva.com/kotlin-android-extensions/

आपको इसे अपने build.gradle में जोड़कर कोटलिन Android एक्सटेंशन को सक्षम करने की आवश्यकता है :

apply plugin: 'org.jetbrains.kotlin.android.extensions'
androidExtensions {
    experimental = true
}

कोटलिन के इस नए संस्करण के बाद से, एंड्रॉइड एक्सटेंशन्स ने कुछ नई दिलचस्प विशेषताओं को शामिल किया है: किसी भी वर्ग में कैश (जिसमें दिलचस्प रूप से HHZ शामिल हैं)

ViewHolder (या किसी भी कस्टम वर्ग) पर इसका उपयोग करना। ध्यान दें कि इस वर्ग को LayoutContainerइंटरफ़ेस लागू करना चाहिए :

class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), 
        LayoutContainer {

    fun bind(title: String) {
        itemTitle.text = "Hello Kotlin!"
    }
}

3
इस जानकारी में जोड़ना: कोटलिन 1.1.4 के अनुसार यह सुविधा प्रायोगिक है और इसे बिल्ड.ग्रेडल फ़ाइल में सक्षम करने की आवश्यकता है
मिगुएल बेल्ट्रान

2
क्या यह प्रायोगिक है? मैं इसे उत्पादन कोड में उपयोग करना चाहता हूं
कार्सन होल्जाइमर

@CarsonHolzheimer यह सुविधा अभी भी प्रायोगिक है
the_dani

लगता है कि यह भी काम नहीं करता है 1.3.21। मुझे लगता है कि वे इसे लागू नहीं करने जा रहे हैं
user924

लेकिन हम उपयोग कर सकते हैं containerView.itemTitle.text = "Hello Kotlin!"और मुझे लगता है कि यह पर्याप्त है
user924

11

आप की जरूरत है

import kotlinx.android.synthetic.row_wall.view.*

और बाद में:

convertView.titleText.text = item.title

मुद्दा यह है कि दृश्य। * दृश्य वर्ग के लिए एक्सटेंशन का परिचय देता है।


1
जवाब पहले ही दिया गया था stackoverflow.com/a/33428208/7767664 आपने इसे क्यों दोहराया?
user924

8

प्रयत्न

class CustomViewModel(val baseView: View) {
    val firstName = baseView.firstName
    val lastName = baseView.lastName
}

देखें ऑब्जेक्ट, रेफरी को दिखाता है: https://discuss.kotlinlang.org/t/unable-to-use-kotlin-android-extension-in-adapter-class/2890


जवाब पहले ही दिया गया था stackoverflow.com/a/33428208/7767664 आपने इसे क्यों दोहराया?
user924

@ user924 यदि उत्तर पहले से ही किसी अन्य धागे में है, तो कृपया मध्यम धागे को वर्तमान धागे की नकल के रूप में चिह्नित करें और अन्य धागे के संदर्भ में जोड़ें
हाइना

4

यदि आप नवीनतम संस्करण l का उपयोग कर रहे हैं; तो आपको इसके लिए प्रायोगिक = सत्य जोड़ना नहीं है।

परियोजना स्तर में स्नातक

classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21'

और ऐप लेवल ग्रैडल में

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions' //These should be on the top of file.

और निर्भरता में ..

implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21'

और नीचे आयात करें

import kotlinx.android.synthetic.main.your_layout_file_name.view.*

और उदाहरण है

import kotlinx.android.synthetic.main.item_animal.view.*

class AnimalVH(parent: ViewGroup, layoutID: Int) : BaseViewHolder<Animal>(parent, layoutID) {

    override fun bindData(animal: Animal) {
        itemView.tv_animal.text = animal.title
    }
}

BaseViewHolder कहां है

abstract class BaseViewHolder<T>(parent: ViewGroup, layoutID: Int) : RecyclerView.ViewHolder(
    LayoutInflater.from(parent.context).inflate(layoutID, parent, false)
) {
    abstract fun bindData(model: T)
}

क्या इस बारे में कोई आधिकारिक पुष्टि है? मेरा मानना ​​है कि .view.*आयात का उपयोग उद्देश्य को धता बताता है findViewById<>, हर बार गिरावट होगी - बहुत पैटर्न से एक ViewHolderdissuades।
स्काईनेट


1

इसका मतलब है कि आपको अपनी स्रोत फ़ाइल की शुरुआत में इस पंक्ति को रखना होगा:

import kotlinx.android.synthetic.main.view.*

इसलिए अब, उदाहरण के लिए, findView(R.id.textView) as TextViewआप बस लिखेंगे textView। उत्तरार्द्ध एक सिंथेटिक विस्तार संपत्ति है जो पैकेज में स्थित है kotlinx.android.synthetic.main.view, यही कारण है कि आपको इससे सब कुछ आयात करना होगा।

आधिकारिक साइट पर एक ट्यूटोरियल है , एक नज़र डालें।


1
मैंने इसे अभी तक देखा है। मैंने इसे अपनी गतिविधि के लिए किया है, जैसा कि मैंने ऊपर वर्णित किया है। लेकिन मैं इसका उपयोग बेस एडेप्टर डेरिवेटिव्स के अंदर कैसे कर सकता हूं?
busylee

1
ठीक है, मूल रूप से आप की तरह, findViewById()पर विधि आह्वान कर सकते Viewहैं holder.findViewById(R.id.name)। Kotlin Android एक्सटेंशन के साथ आप बस लिख सकते हैं holder.name। मान लीजिए कि यह कोड एक getView()फ़ंक्शन के अंदर लिखा गया है :val base = inflater.inflate(R.layout.list_item, parent, false) base.name.text = "John Smith"
yanex

लेकिन क्या होगा अगर मुझे विभिन्न लेआउट के साथ कई दृश्य धारकों का उपयोग करना है? मैं इसे सिंथेटिक के साथ कैसे महसूस कर सकता हूं? क्योंकि हमें प्रत्येक लेआउट के लिए विशिष्ट "सिंथेटिक लिंक" का उपयोग करना होगा और मेरे पास समान आईडी वाले कई लेआउट हैं।
नातान रुबिनस्टीन

0

FYI करें: डेटा लुकिंग को सिंथेटिक के ऊपर व्यू लुक्स के लिए अनुशंसित किया गया है।

Reddit पर Google से Android के लिए DA से टिप्पणी करें

अरे! डेवलपर यहाँ Google पर Android के लिए वकील!

मैं यहां थोड़ी पृष्ठभूमि जोड़ना चाहता था। सिंथेटिक विचारों के साथ कोटलिन एक्सटेंशन कभी जानबूझकर "अनुशंसित" नहीं था, हालांकि उन्हें उपयोग न करने की सिफारिश के रूप में नहीं लिया जाना चाहिए। यदि वे आपके लिए काम कर रहे हैं तो कृपया उन्हें अपने ऐप में उपयोग करना जारी रखने के लिए स्वतंत्र महसूस करें!

हम उनसे दूर जा रहे हैं (जैसे कि हम उन्हें उडनेस कोर्स में नहीं सिखाते हैं) क्योंकि वे आईडी के एक वैश्विक नामस्थान को उजागर करते हैं जो उस लेआउट से असंबंधित है जो वास्तव में अमान्य लुक अप के खिलाफ कोई चेक नहीं है, कोटलिन और डॉन हैं जब दृश्य केवल कुछ विन्यास में मौजूद होते हैं, तो अशक्तता को उजागर नहीं किया जाता है। सभी एक साथ, इन मुद्दों के कारण एपीआई एंड्रॉइड ऐप के लिए क्रैश की संख्या बढ़ाता है।

दूसरी ओर, वे एक हल्के एपीआई की पेशकश करते हैं जो देखने के लुक को आसान बनाने में मदद कर सकता है। इस स्पेस में डेटा बाइंडिंग पर भी नज़र डालने लायक है, जो स्वचालित रूप से व्यू लुकअप भी करता है - साथ ही डेटा परिवर्तन के रूप में अपने विचारों को स्वचालित रूप से अपडेट करने के लिए LiveData के साथ एकीकृत करता है।

आज, इस स्थान में कुछ विकल्प हैं जो काम करते हैं:

डेटा बाइंडिंग देखने के साथ-साथ बाइंडिंग देखने के लिए सिफारिश है, लेकिन एंड्रॉइड कोटलिन एक्सटेंशन की तुलना में यह ओवरहेड को थोड़ा जोड़ देता है। यह देखने लायक है कि यह आपके ऐप के लिए अच्छा है या नहीं। डेटा बाइंडिंग भी आपको डेटा बदलने पर स्वचालित रूप से विचारों को बाँधने के लिए LiveData का निरीक्षण करने की अनुमति देता है। कोटलिन एक्सटेंशन्स की तुलना में, यह व्यू लुक्स और टाइप सेफ्टी के कंपाइल टाइम चेकिंग को जोड़ता है। एंड्रॉइड कोटलिन एक्सटेंशन की आधिकारिक तौर पर सिफारिश नहीं की गई है (जो कि इसके खिलाफ सिफारिश के समान नहीं है)। यह ऊपर वर्णित मुद्दों के साथ आता है, इसलिए हमारे कोड के लिए हम उनका उपयोग नहीं कर रहे हैं। बटर नाइफ एक और उपाय है जो बेहद लोकप्रिय है और कोटलिन और जावा प्रोग्रामिंग लैंग्वेज दोनों के लिए काम करता है। यहाँ टिप्पणियों के माध्यम से पढ़ना ' कई डेवलपर्स जो कोटलिन एक्सटेंशन के साथ बहुत अच्छी किस्मत रखते हैं। यह बहुत अच्छा है - और कुछ हम ध्यान में रखेंगे क्योंकि हम अपने एपीआई में सुधार जारी रखने के तरीकों को देखते हैं। यदि आपने डेटा बाइंडिंग पर एक नज़र नहीं डाली है, तो निश्चित रूप से इसे एक शॉट दें।

एक तरफ के रूप में, हमारे आंतरिक कोड शैली गाइड को सीधे हमारे कोडबेस के बाहर लागू करने का इरादा नहीं है। उदाहरण के लिए, हम mPrefixVariables का उपयोग करते हैं, लेकिन ऐसा कोई कारण नहीं है कि प्रत्येक ऐप को उस शैली का पालन करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.