1

I am trying to create a Custom Adapter drawing data from RealmObject():

The RealmObject() returns a string containing title and description delimited by comma, which will be split in the Custom Adapter.

Apparently RealmResults.toArray() is of type Array while the Custom Adapter accepts Array.I tried to convert RealmResults to an Array of String by appending by changing it toresults.toArray() as Array but I'm getting the following error.

**java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]**

Apparently results.toArray() is of type Array while the Custom Adapter accepts Array.

I changed it to but I got an error.

Main Fragment:

override fun onResume() {
    super.onResume()

    Realm.init(context!!)
    val realm = Realm.getDefaultInstance()

    val query = realm.where(CyeFarmListObject::class.java)
    val results = query.findAll()

    val listView = view?.findViewById<ListView>(R.id.moviesListView)

    listView?.setOnItemClickListener { _, _, i, _ ->
        val selectedMovie = results[i]
        val editIntent = Intent(activity, EditMoviesActivity::class.java)
        if (selectedMovie!= null) {
            editIntent.putExtra("movieItem", selectedMovie.getID())
            startActivity(editIntent)
        }
    }

    val array: Array<String> = results.toArray() as Array<String>

    val adapter =
        activity?.let { MyListAdapter(it, array) }
    if (listView != null) {
        listView.adapter = adapter
    }
}

Layout file:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="15dp"
            android:text="title"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
            android:textStyle="bold" />


        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical">

            <TextView
                android:id="@+id/description"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="15dp"
                android:layout_marginTop="5dp"
                android:text="description"
                android:textSize="16sp" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

Custom Adapter:

import android.app.Activity
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.TextView

class MyListAdapter(private val context: Activity, private val a: Array<String>)
    : ArrayAdapter<String>(context, R.layout.fragment_list_of_list, a) {

    override fun getView(position: Int, view: View?, parent: ViewGroup): View {

        val inflater = context.layoutInflater
        val rowView = inflater.inflate(R.layout.fragment_list_of_list, null, true)

        var splitter : Array<String> = a.toString().split(",").toTypedArray()
        var split1 = splitter[0]
        var split2 = splitter[1]

        val titleText = rowView.findViewById<TextView>(R.id.title) as TextView
        val descriptionText = rowView.findViewById<TextView>(R.id.description) as TextView

        titleText.text = split1
        descriptionText.text = split2

        return rowView
    }
}

Logcat:

2020-04-08 18:49:03.232 4945-4945/com.my.code E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.my.code PID: 4945
java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]
    at com.demicode.ccdofieldkit.MovieListFragment.onResume(CyeFarmListFragment.kt:35)
    at androidx.fragment.app.Fragment.performResume(Fragment.java:2747)
    at androidx.fragment.app.FragmentStateManager.resume(FragmentStateManager.java:373)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1199)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
    at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:442)
    at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2169)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1992)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
    at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1818)
    at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:303)
    at androidx.fragment.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:246)
    at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
    at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:669)
    at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:631)
    at androidx.viewpager.widget.ViewPager.setCurrentItem(ViewPager.java:612)
    at com.google.android.material.tabs.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:3222)
    at com.google.android.material.tabs.TabLayout.dispatchTabSelected(TabLayout.java:1734)
    at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1727)
    at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1687)
    at com.google.android.material.tabs.TabLayout$Tab.select(TabLayout.java:2080)
    at com.google.android.material.tabs.TabLayout$TabView.performClick(TabLayout.java:2269)
    at android.view.View.performClickInternal(View.java:7327)
    at android.view.View.access$3600(View.java:807)
    at android.view.View$PerformClick.run(View.java:28166)
    at android.os.Handler.handleCallback(Handler.java:907)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:216)
    at android.app.ActivityThread.main(ActivityThread.java:7464)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:955)
Kellin Strook
  • 487
  • 1
  • 5
  • 18
  • Use `toTypedArray()` instead of `toArray()`. – Tenfour04 Apr 08 '20 at 11:56
  • @Tenfour04 it shows: Type mismatch! Required: String Found: My RealmObject! – Kellin Strook Apr 08 '20 at 12:17
  • 2
    Oh, I don't use Realm and was assuming `results` was a `List`. You can use `results.map(MyRealmObject::toString).toTypedArray()`. And if the text isn't what you want, you can override `toString` in your MyRealmObject class. – Tenfour04 Apr 08 '20 at 12:58
  • Hi, it worked. didn't know about map before. Had to switch from beginTransaction() and commitTransaction to executeTransaction (which is better though) and it worked fine. Thanks! – Kellin Strook Apr 08 '20 at 13:37
  • See https://stackoverflow.com/questions/3832254/how-can-i-make-my-arrayadapter-follow-the-viewholder-pattern – EpicPandaForce Apr 10 '20 at 19:03

0 Answers0