Gdy próbuję znaleźć RecycleView
identyfikator według identyfikatora, pojawia się następujący błąd .
Błąd: - wnioskowanie o typie nie powiodło się: za mało informacji, aby wywnioskować parametr T
Kod:
class FirstRecycleViewExample : AppCompatActivity() {
val data = arrayListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_recycleview)
val recycler_view = findViewById(R.id.recycler_view) as RecyclerView ///IN THIS LINE I AM GETTING THE ERROR
data.add("First Data")
data.add("Second Data")
data.add("Third Data")
data.add("Forth Data")
data.add("Fifth Data")
//creating our adapter
val adapter = CustomRecycleAdapter(data)
//now adding the adapter to recyclerview
recycler_view.adapter = adapter
}
}
android
android-layout
kotlin
type-inference
Ravindra Kushwaha
źródło
źródło
<>
gdy go używam, daje błąd.Jesteś na poziomie API 26, gdzie typ powrót
findViewById
jest obecnie rodzajowyT
zamiastView
a zatem można wywnioskować. Możesz zobaczyć odpowiedni dziennik zmian tutaj .Więc powinieneś być w stanie to zrobić:
val recycler_view = findViewById<RecyclerView>(R.id.recycler_view)
Albo to:
val recycler_view: RecyclerView = findViewById(R.id.recycler_view)
źródło
W
Kotlin
możemy uzyskać identyfikator widoku bez użyciafindViewById
składni.Na przykład używamy poniższego układu, z którego uzyskamy identyfikator widoku i wykonamy operację
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/welcomeMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Hello World!"/> </FrameLayout>
Jesteśmy w stanie znaleźć id widoku za pomocą poniższego kodu
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) welcomeMessage.text = "Hello Kotlin!" ////WE ARE GETTING THE IDS WITHOUT USING THE FINDVIEWBYID syntax }
Aby móc z niego korzystać, potrzebujesz specjalnego importu (tego, który napiszę poniżej), ale IDE jest w stanie go zaimportować automatycznie. Nie może być prostsze!
import kotlinx.android.synthetic.main.YOUR_LAYOUT_NAME.*/// HERE "YOUR_LAYOUT_NAME" IS YOUR LAYOUT NAME WHICH U HAVE INFLATED IN onCreate()/onCreateView()
Musimy zaimportować tę właściwość, aby uzyskać identyfikator widoku bez użycia
findviewbyid
składni.Więcej informacji na ten temat można znaleźć pod tym linkiem: - Kliknij tutaj
źródło
Zwykle Kotlin może wywnioskować twój typ na podstawie informacji podanych w nawiasach.
W tym przypadku nie może, więc musisz to wyraźnie określić w ten sposób
Nie jestem jednak pewien typu, ale tak powinieneś go określić
Chciałbym dodać, że używając Anko , możesz jeszcze bardziej uprościć swój kod w ten sposób:
val recycler_view : RecyclerView = find(R.id.recycler_view)
źródło
Dodaj tę linię do swojego kodu jako Cokolwiek używasz kontrolera.
val tvHello = findViewById<TextView>(R.id.tvHello)
źródło
Możesz zignorować nadawanie identyfikatorów zmiennym w kotlin. Wystarczy użyć wtyczki
Wklej to w swoim gradle
apply plugin: 'kotlin-android-extensions'
a wtedy nie musisz przypisywać identyfikatorów do var, możesz to zrobić tak jak
źródło
Spróbuj tego:
Tutaj
bind
funkcja ogólna służy do wiązania widoku. jego ogólna funkcja, której może używać w dowolnym widoku.class MyActivity : AppCompatActivity() { private lateinit var recycler_view : RecyclerView override fun onCreate(savedInstanceState: Bundle?) { ... recycler_view = bind(R.id.recycler_view) } } fun <T : View> Activity.bind(@IdRes res : Int) : T { @Suppress("UNCHECKED_CAST") return findViewById(res) as T }
źródło
Nie musisz nawet tworzyć obiektu, aby robić rzeczy z widokiem. Możesz po prostu użyć identyfikatora. Na przykład Kotlin
jest taki sam jak Java
źródło
Nie mogłem uzyskać dostępu do komponentów interfejsu użytkownika, takich jak OP, jak wygląda poniżej, był potrzebny w gradle aplikacji:
plugins { ... id 'kotlin-android-extensions' }
Mimo że po dodaniu tej linii Android Studio nadal nie było w stanie automatycznie rozwiązać importu syntetyków kotlin, więc może być konieczne unieważnienie pamięci podręcznej i ponowne uruchomienie.
Jeśli nadal nie działa, zaimportuj ręcznie w zależności od widoków
Aktualizacja - 2
Jeśli otrzymujesz to ostrzeżenie informacyjne -
plugin 'kotlin-android-extensions' zostanie wycofany. Więc dodaj poniżej w swojej aplikacji
android { ... buildFeatures { viewBinding true } }
źródło