অ্যাডাপ্টার বা ভিউহোল্ডারে কোটলিন সিনথেটিক


87

আমি কোটলিনে নতুন। আমি findViewByIdআমার Activityক্লাসে বিরক্তিকর পদ্ধতির পরিবর্তে সিনথেটিক পদ্ধতিটি ব্যবহার করার চেষ্টা করেছি এবং খুঁজে পেয়েছি , তবে আমি খুঁজে পেয়েছি "যদি আমরা ভিউতে সিন্থেটিক বৈশিষ্ট্যগুলি (অ্যাডাপ্টারের ক্লাসে দরকারী) বলতে চাই, তবে আমাদেরও কোটলিনেক্স.অ্যান্ড্রয়েড.সেন্টিথিক.মাইন আমদানি করা উচিত .ভিউ। *। " তবে আমি ঠিক বুঝতে পারি না যে এটি ঠিক কীভাবে কাজ করে? কোন উদাহরণ আছে?


উত্তর:


99

Https://github.com/antoniolg/Kotlin-for-Android- ডেভেলপারদের থেকে সাধারণ উদাহরণ

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
ঠিক আছে, এটি বোবা প্রশ্ন হতে পারে তবে 'আইটেম ভিউ' রেফারেন্সটি কোথা থেকে এসেছে?
সাওলো আগুইয়ার

4
ঠিক আছে, আমি লক্ষ্য করেছি যে আমি। ভিউটি মিস করছি। আমদানির অংশ। এখন, আইটেম ভিউ রেফারেন্সটি উপলভ্য, এবং এটি v7 সমর্থন প্যাকেজে রিসাইক্লারভিউ.ভিউহোল্ডার শ্রেণি থেকে এসেছে বলে মনে হচ্ছে। Tks
আগুইয়ার

4
দেখার এক্সটেনশনের জন্য কোনও ক্যাশে নেই, তাই ভিউ সম্পর্কিত উল্লেখগুলি সাধারণ ভিউহোল্ডারের মতো ক্যাশে করা উচিত।
মিহা_এক্স 64

4
@ মাইকটি কোটলিন ১.১.৪ থেকে সমস্ত মতামত ক্যাশে হবে। এমনকি ভিউহোল্ডারগুলিতেও। আপনার পোস্ট করা নিবন্ধটিও এর উল্লেখ করে।
স্টিফান মেড্যাক

4
@ স্টেফানমেড্যাক আমি নিবন্ধটির লেখক :) যদিও আমি এটি উল্লেখ করতে হবে যে এটি কেবল পরীক্ষামূলক বৈশিষ্ট্যের একটি অংশ এবং ম্যানুয়ালি সক্ষম হওয়া দরকার। আমি এখনও চেষ্টা করে দেখিনি।
মিগুয়েল বেল্ট্রান

37

কোটলিং 1.1.4 আউট

আরও তথ্য: https://antonioleiva.com/kotlin-android-extensions/

আপনার বিল্ডড্র্যাডলে এটি যুক্ত করে আপনার কোটলিন অ্যান্ড্রয়েড এক্সটেনশানগুলি সক্ষম করতে হবে :

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

কোটলিনের এই নতুন সংস্করণ থেকে, অ্যান্ড্রয়েড এক্সটেনশনগুলি কিছু নতুন আকর্ষণীয় বৈশিষ্ট্য সমন্বিত করেছে: যে কোনও শ্রেণিতে ক্যাশে (যা আকর্ষণীয়ভাবে ভিউহোল্ডারকে অন্তর্ভুক্ত করে)

এটি ভিউহোল্ডার (বা কোনও কাস্টম শ্রেণিতে) ব্যবহার করে। নোট করুন যে এই শ্রেণীর LayoutContainerইন্টারফেস প্রয়োগ করা উচিত :

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

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

4
এই তথ্যে যোগ করা হচ্ছে: কোটলিন ১.১.৪ অনুসারে বৈশিষ্ট্যটি পরীক্ষামূলক এবং বিল্ড.gradle ফাইলটিতে সক্ষম করা দরকার
মিগুয়েল

4
এটি কি আর পরীক্ষামূলক? আমি এটি প্রোডাকশন কোডে ব্যবহার করতে চাই
কারসন হল্হাইমার

@ কারসন হোলজিহিমার এই বৈশিষ্ট্যটি এখনও পরীক্ষামূলক
the_dani

মনে হয় এটি এমনকি কাজ করে না 1.3.21। আমি মনে করি তারা এটিকে বাস্তবায়ন করবে না
user924

তবে আমরা ব্যবহার করতে পারি containerView.itemTitle.text = "Hello Kotlin!"এবং আমি মনে করি এটি যথেষ্ট
ইউজার 924

11

তোমার দরকার

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

এবং পরে লাইন বরাবর কিছু:

convertView.titleText.text = item.title

মুল বক্তব্যটি হল * ভিউ ক্লাসে এক্সটেনশনগুলি প্রবর্তন করে।


4
উত্তর ইতিমধ্যে 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 দেওয়া হয়েছিল কেন আপনি এটি পুনরাবৃত্তি করলেন?
ব্যবহারকারী 924

@ ব্যবহারকারী924। যদি উত্তরটি ইতিমধ্যে অন্য থ্রেডে থাকে তবে দয়া করে সংযুক্ত করুন এবং বর্তমান থ্রেডটিকে সদৃশ হিসাবে চিহ্নিত করুন এবং অন্যান্য থ্রেডের রেফারেন্স যুক্ত করুন
হায়না

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

যেখানে বেসভিউহোল্ডার

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<>, প্রতিবারই ফলব্যাক হবে - একেবারে প্যাটার্ন ViewHolderথেকে দূরে।
স্কাইনেট

এখানে ব্যাখ্যা করা হয়েছে: প্রোয়ান্ড্রোয়েডেভ.com/…
স্কাইনেট

1

এর অর্থ এটি আপনার উত্স ফাইলের শুরুতে এই লাইনটি রাখতে হবে:

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

সুতরাং এখন পরিবর্তে, উদাহরণস্বরূপ, findView(R.id.textView) as TextViewআপনি ঠিক লিখতে হবে textView। পরবর্তীটি প্যাকেজে অবস্থিত একটি সিন্থেটিক এক্সটেনশন সম্পত্তিkotlinx.android.synthetic.main.view , এজন্য আপনাকে এখান থেকে সমস্ত কিছু আমদানি করতে হবে।

অফিসিয়াল সাইটে একটি টিউটোরিয়াল আছে , একবার দেখুন।


4
আমি এখনও এটি দেখেছি। আমি আমার ক্রিয়াকলাপের জন্য এটি করেছি, আমি উপরে বর্ণিত হিসাবে। তবে আমি কীভাবে এটি বেসএডাপ্টার ডেরিভেটিভসের মধ্যে ব্যবহার করতে পারি?
বুজলি

4
ভাল, মূলত আপনি findViewById()একটি পদ্ধতিতে অনুরোধ করতে Viewপারেন holder.findViewById(R.id.name)। কোটলিন অ্যান্ড্রয়েড এক্সটেনশনগুলির সাহায্যে আপনি কেবল লিখতে পারেন holder.name। ধরুন এই কোডটি কোনও getView()ফাংশনের অভ্যন্তরে লিখিত হয়েছে :val base = inflater.inflate(R.layout.list_item, parent, false) base.name.text = "John Smith"
ইয়েনেক্স

তবে যদি আমাকে বিভিন্ন লেআউট সহ বেশ কয়েকটি ভিউ হোল্ডার ব্যবহার করতে হয়? আমি কীভাবে এটি সিন্থেটিক দিয়ে উপলব্ধি করতে পারি? কারণ প্রতিটি লেআউটের জন্য আমাদের নির্দিষ্ট "সিন্থেটিক লিঙ্ক" ব্যবহার করতে হবে এবং আমার অনুরূপ আইডির সাথে বেশ কয়েকটি লেআউট রয়েছে।
নাটান রুবিনস্টাইন

0

এফওয়াইআই: ভিউ লুপআপের জন্য সিন্থেটিকের উপরে ডেটা বাইন্ডিংয়ের প্রস্তাব দেওয়া হয়।

রেডডিটে গুগল থেকে অ্যান্ড্রয়েডের জন্য একটি ডিএর মন্তব্য

আরে! গুগলে Android এর জন্য বিকাশকারী অ্যাডভোকেট!

আমি এখানে কিছুটা পটভূমি যুক্ত করতে চেয়েছিলাম। সিন্থেটিক ভিউ সহ কোটলিন এক্সটেনশনগুলি ইচ্ছাকৃতভাবে কখনই "প্রস্তাবিত" হয়নি তবে সেগুলি ব্যবহার না করার জন্য একটি সুপারিশ হিসাবে নেওয়া উচিত নয়। যদি তারা আপনার জন্য কাজ করে থাকে তবে দয়া করে বিনা দ্বিধায় আপনার অ্যাপ্লিকেশনটিতে এটি ব্যবহার করুন!

আমরা তাদের থেকে সরে যাচ্ছি (যেমন আমরা উদাসিটি কোর্সে তাদের শিক্ষা দিই না) কারণ তারা এই আইডির একটি বিশ্বব্যাপী নেমস্পেস প্রকাশ করে যা এই লেআউটের সাথে সম্পর্কিত নয় যা আসলে অবৈধ অনুসন্ধানগুলির বিরুদ্ধে কোনও চেক দিয়েই স্ফীত হয়, কেবল কোটলিন, এবং ডন যখন দৃষ্টিভঙ্গি কেবলমাত্র কিছু কনফিগারেশনে উপস্থিত থাকে তখন অযোগ্যতা প্রকাশ করা হয় না। সব মিলিয়ে এই সমস্যাগুলির কারণে এপিআইয়ের অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলির ক্র্যাশের সংখ্যা বাড়তে পারে।

অন্যদিকে, তারা এমন একটি হালকা ওজনের এপিআই দেয় যা দর্শন লকআপগুলিকে সহজ করতে সহায়তা করে। এই স্পেসে এটি ডেটা বাঁধাইয়ের দিকে নজর দেওয়াও উপযুক্ত যা স্বয়ংক্রিয় দৃশ্যের চেহারাগুলিও করে - পাশাপাশি ডেটা পরিবর্তনের হিসাবে আপনার ভিউগুলি স্বয়ংক্রিয়ভাবে আপডেট করতে লাইভডাটার সাথে সংহত করে।

আজ, এই স্পেসে কয়েকটি বিকল্প রয়েছে যা কাজ করে:

ডেটা বাইন্ডিং হ'ল দেখার পাশাপাশি বাঁধাইয়ের জন্য সুপারিশ, তবে অ্যান্ড্রয়েড কোটলিন এক্সটেনশনের তুলনায় এটি কিছুটা ওভারহেড যুক্ত করে। এটি আপনার অ্যাপ্লিকেশনটির জন্য উপযুক্ত কিনা তা একবার দেখে নেওয়া মূল্যবান। ডেটা বাইন্ডিং আপনাকে যখন ডেটা পরিবর্তিত হয় তখন স্বয়ংক্রিয়ভাবে দেখা বাঁধার জন্য লাইভডাটা পর্যবেক্ষণ করতে দেয়। কোটলিন এক্সটেনশনগুলির সাথে তুলনা করে, এটি ভিউ লুকআপ এবং টাইপ সুরক্ষা সংকলনের সময় পরীক্ষা করে। অ্যান্ড্রয়েড কোটলিন এক্সটেনশনগুলি আনুষ্ঠানিকভাবে সুপারিশ করা হয় না (যা সুপারিশের মতো নয়)) এটি উপরে উল্লিখিত সমস্যাগুলির সাথে আসে না, সুতরাং আমাদের কোডের জন্য আমরা সেগুলি ব্যবহার করি না। মাখন ছুরির একটি আরও সমাধান যা অত্যন্ত জনপ্রিয় এবং কোটলিন এবং জাভা প্রোগ্রামিং ভাষা উভয়ের পক্ষে কাজ করে। এখানে মন্তব্যের মাধ্যমে পড়া ' কোটলিন এক্সটেনশানগুলির সাথে দুর্দান্ত ভাগ্যবান এমন অনেক বিকাশকারী sa এটি দুর্দান্ত - এবং আমরা আমাদের API গুলি উন্নত করার উপায়গুলির দিকে নজর রেখে কিছু মনে রাখব। আপনি যদি ডেটা বাইন্ডিংয়ের দিকে নজর না দিয়ে থাকেন তবে অবশ্যই তা শট দিন।

অন্যদিকে, আমাদের অভ্যন্তরীণ কোড শৈলীর গাইডটি আমাদের কোডবেসের বাইরে সরাসরি প্রয়োগ করার উদ্দেশ্যে নয়। উদাহরণস্বরূপ, আমরা mPrefixVariables ব্যবহার করি তবে প্রতিটি অ্যাপ্লিকেশনটিকে সেই স্টাইলটি অনুসরণ করা উচিত বলে কোনও কারণ নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.