Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Kotlin] Ottenere oggetto da custo adapter

    ciao!

    specifico kotlin, ma in verità ho lo stesso problema in java.
    ho una listview con un custom adapter:
    codice:
    package com.mp.mpbook
    
    import android.content.Context
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.BaseAdapter
    import android.widget.TextView
    import java.util.*
    import kotlin.collections.ArrayList
    import kotlin.collections.HashMap
    
    
    class BookAdapter(
        private val context: Context,
        private val dataList: ArrayList<HashMap<String, String>>
    ) : BaseAdapter() {
    
        val inflater: LayoutInflater =
            this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater;
        var tempNameVersionList = ArrayList(dataList)
    
        override fun getCount(): Int {
            return dataList.size;
        }
    
        override fun getItem(position: Int): Int {
            return position;
        }
    
        override fun getItemId(position: Int): Long {
            return position.toLong();
        }
    
        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
            var dataitem = dataList[position];
    
            val rowView = inflater.inflate(R.layout.list_row, parent, false);
            rowView.findViewById<TextView>(R.id.txtTitle).text = dataitem.get("title");
    
            rowView.tag = position;
            return rowView;
        }
    
        fun filter(text: String?) {
            val text = text!!.toLowerCase(Locale.getDefault());
            dataList.clear();
    
            if (text.length == 0) {
                dataList.addAll(tempNameVersionList);
            } else {
                for (i in 0..tempNameVersionList.size - 1) {
                    if (tempNameVersionList.get(i).get("title")!!.toLowerCase(Locale.getDefault())
                            .contains(text)
                    ) {
                        dataList.add(tempNameVersionList.get(i));
                    }
                }
            }
            notifyDataSetChanged();
        }
    }
    quando clicco su una voce, vorrei prendere l'intero oggetto Book dall'adapter.
    ho provato così vedendo diversi tutorial:
    codice:
    val listView = findViewById<ListView>(R.id.listView);
    listView.setOnItemClickListener { parent, view, position, id ->
        val b = parent.getItemAtPosition(position) as Book;
    }
    ma ottengo questo errore:
    codice:
    java.lang.ClassCastException: java.lang.Long cannot be cast to com.mp.mpbook.Book
            at com.mp.mpbook.MainActivity$onCreate$2.onItemClick(MainActivity.kt:42)
            at android.widget.AdapterView.performItemClick(AdapterView.java:318)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1201)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3178)
            at android.os.Handler.handleCallback(Handler.java:873)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:6898)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

    l'errore l'ho capito, ma non ho capito se e come risolvere il problema!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    ciao!
    quando clicco su una voce, vorrei prendere l'intero oggetto Book dall'adapter.
    Premetto che: di Android ne so molto poco (mi ricordo qualche concetto letto e provato in passato) e Kotlin lo sto (ri)studiando.

    Tu dici che vorresti prendere il Book dal Adapter. Ma nota una cosa: dal adapter dove verrebbero originati gli oggetti Book?? Il tuo adapter lo crei passando un Context (di Android) e una lista di map String-->String. Quindi i Book dove sarebbero??

    Poi perché usi for (i in 0..tempNameVersionList.size - 1) ?
    Forse sei ancora "ancorato" al C o al Java basilare. Perché non iteri sulla lista per ottenere direttamente gli item??

    for (item in tempNameVersionList)

    Perché hai usato get("title")!!. ??
    Se pensavi di "proteggerti" dai null, non è quello che va bene.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ciao!

    in effetti non ci avevo pensato.
    ho modificato così e adesso funziona:
    codice:
    package com.mp.mpbook
    
    import android.content.Context
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.BaseAdapter
    import android.widget.TextView
    import java.util.*
    import kotlin.collections.ArrayList
    
    class BookAdapter(
        private val context: Context,
        private val dataList: ArrayList<Book>
    ) : BaseAdapter() {
    
        val inflater: LayoutInflater =
            this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater;
        var tempNameVersionList = ArrayList(dataList)
    
        override fun getCount(): Int {
            return dataList.size;
        }
    
        override fun getItem(position: Int): Book {
            return dataList.get(position);
        }
    
        override fun getItemId(position: Int): Long {
            return position.toLong();
        }
    
        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
            val rowView = inflater.inflate(R.layout.list_row, parent, false);
            var item: Book = getItem(position);
            rowView.findViewById<TextView>(R.id.txtTitle).text = item.title;
            rowView.tag = position;
            return rowView;
        }
    
        fun filter(text: String?) {
            val text = text!!.toLowerCase(Locale.getDefault());
            dataList.clear();
    
            if (text.length == 0) {
                dataList.addAll(tempNameVersionList);
            } else {
                for (b: Book in tempNameVersionList) {
                    if (b.title.toLowerCase().contains(text)) {
                        dataList.add(b);
                    }
                }
            }
            notifyDataSetChanged();
        }
    }
    e ho sistemato anche le altre due cose che mi hai suggerito.
    grazie per il suggerimento!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.