Cercare in una Listview Android con Kotlin

Mattepuffo's logo
Cercare in una Listview Android con Kotlin

Cercare in una Listview Android con Kotlin

In questo articolo abbiamo visto come riempire una ListView Android con Kotlin.

Oggi aggiungiamo la funzionalità di ricerca con la SearchView.

Partiamo dal layout (acticity_main.xml):

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

    <SearchView
        android:id="@+id/searchView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

Questo il layout della lista, che non è cambiato, ma che vi riporto lo stesso (list_row.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="20dp"
    android:weightSum="1"
    android:gravity="center_vertical"
    android:baselineAligned="false">

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

        <TextView
            android:id="@+id/txtTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    </LinearLayout>

</LinearLayout>

Adesso dobbiamo fare qualche modifica all'adapter:

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();
    }
}

Abbiamo aggiunto una funzione per la ricerca ad una lista di appoggio (che di partenza è la copia di quella passata come argomento).

Questa l'Acitivity:

import android.os.Bundle
import android.util.Log
import android.widget.ListView
import android.widget.SearchView
import androidx.appcompat.app.AppCompatActivity
import com.android.volley.Request
import com.android.volley.Response
import com.android.volley.toolbox.JsonObjectRequest
import org.json.JSONObject

class MainActivity : AppCompatActivity() {

    var listBook = ArrayList<Book>();
    var bookAdapter: BookAdapter? = null;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        val searchView = findViewById<SearchView>(R.id.searchView);
        val listView = findViewById<ListView>(R.id.listView);

        getData();

        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String?): Boolean {
                return false
            }

            override fun onQueryTextChange(newText: String?): Boolean {
                bookAdapter!!.filter(newText)
                return false
            }
        });
    }

    fun getData() {
        val url = "https://www.mattepuffo.com/api/book/get.php";

        val jsonObjectRequest = JsonObjectRequest(
            Request.Method.GET, url, null,
            Response.Listener { response ->
                val jsonObj = JSONObject(response.toString());
                val books = jsonObj.getJSONArray("books");
                for (i in 0 until books.length()) {
                    val item = books.getJSONObject(i);
                    val book = Book(item.getInt("id"), item.getString("title"));
                    listBook.add(book);
                }

                bookAdapter = BookAdapter(this@MainActivity, listBook)
                findViewById<ListView>(R.id.listView).adapter = bookAdapter;
            },
            Response.ErrorListener { error ->
                Log.e("ERR", error.toString())
            }
        )

        HttpSingleton.getInstance(this).addToRequestQueue(jsonObjectRequest);
    }
}
E questo l'oggetto Book:

data class Book(
    val id: Int,
    val title: String
)

Enjoy!


Condividi

Commentami!