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
    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.
    AndreaSenior Java developerSCJP 5 (91%) – SCWCD 5 (94%)
    Il mio nuovo sito-blog italiano sulla programmazione: andbin.it

  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 © 2020 vBulletin Solutions, Inc. All rights reserved.