Cómo establecer los elementos a RecyclerViewAdapter con Spinner?

Sean Kim:

Estoy tratando de codificar la Recyclerview con la función de dos hiladores. Los principales objetivos es mostrar el resultado de la filtración por dos hiladores. Por ejemplo, hay 7 listas y cada uno tiene una cierta disciplina, como "Architectural", "Mechanical", "eléctrica" ​​y así sucesivamente, y los datos de suelo como 1, 2, 3, 4 ..

Por lo tanto, hice el código como este

Este es el adaptador de la recyclerview.

class ProjectFilesModel(val fileName: String, val ctype: String, val floor: Int)

class FileDataViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer

class FileDataAdapter(val fileList: List<ProjectFilesModel>) :
    RecyclerView.Adapter<FileDataViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FileDataViewHolder {

        val view =
            LayoutInflater.from(parent.context).inflate(R.layout.filtered_file, parent, false)

        return FileDataViewHolder(view)
    }

    override fun getItemCount(): Int {
        return fileList.count()
    }

    override fun onBindViewHolder(holder: FileDataViewHolder, position: Int) {
        holder.containerView.fileNameLayout.text = fileList[position].fileName
        holder.containerView.ctypeLayout.text = fileList[position].ctype
        holder.containerView.floorLayout.text = "${fileList[position].floor}floor"
    }
}

Y, esto es la actividad principal;

class MainActivity : AppCompatActivity() {

    //ctype option array
    var ctypeArray =
        arrayOf("All", "Architectural", "Mechanical", "Electrical", "Structural", "Civil")
    var ctypeOptionAdapter: ArrayAdapter<String>? = null

    //floor option arry
    var floorArray = arrayOf(1, 2, 3)
    var floorOptionAdapter: ArrayAdapter<Int>? = null

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

        ctypeOptionAdapter =
            ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, ctypeArray)
        ctypeOption.adapter = ctypeOptionAdapter

        floorOptionAdapter =
            ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, floorArray)
        floorOption.adapter = floorOptionAdapter

        ctypeOption.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {}

            override fun onItemSelected(
                parent: AdapterView<*>?,
                view: View?,
                position: Int,
                id: Long
            ) {
                if (position >= 0 && position < floorArray.size) {
                    getSelectedListData(position)
                } else {
                    Toast.makeText(
                        this@MainActivity,
                        "Selected Category Does not Exist!",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        }

        val fileArrayList = arrayListOf(
            ProjectFilesModel("A_file", "Architectural", 1),
            ProjectFilesModel("B_file", "Mechanical", 1),
            ProjectFilesModel("C_file", "Electrical", 2),
            ProjectFilesModel("D_file", "Structural", 2),
            ProjectFilesModel("E_file", "Architectural", 2),
            ProjectFilesModel("F_file", "Mechanical", 3),
            ProjectFilesModel("G_file", "Electrical", 3)
        )

        val fileArrayAdapter = FileDataAdapter(fileArrayList)
        filteredListView.adapter = fileArrayAdapter
        filteredListView.layoutManager = LinearLayoutManager(this)

    }

    fun getSelectedListData(position: Int) {
        /* I'm stuck from here..*/
    }
}

No estoy seguro de que voy formas correctas ..

¡Por favor, deme algunos consejos!

Ethan Choi:

Por mucho que a continuación. Por favor refiérase a los comentarios.

Adaptador

class FileDataAdapter : RecyclerView.Adapter<FileDataViewHolder>() {
    var items : List<ProjectFilesModel> = listOf()
    set(value) {
        // implements setter for notifying item changed
        field = value
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FileDataViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.filtered_file, parent, false)
        return FileDataViewHolder(view)
    }

    override fun getItemCount(): Int = items.count()

    override fun onBindViewHolder(holder: FileDataViewHolder, position: Int) {
        holder.containerView.fileNameLayout.text = fileList[position].fileName
        holder.containerView.ctypeLayout.text = fileList[position].ctype
        holder.containerView.floorLayout.text = "${fileList[position].floor}floor"
    }
}

Actividad

class MainActivity : AppCompatActivity() {

    //ctype option array
    var ctypeArray =
        arrayOf("All", "Architectural", "Mechanical", "Electrical", "Structural", "Civil")
    var ctypeOptionAdapter: ArrayAdapter<String>? = null

    //floor option arry
    var floorArray = arrayOf(1, 2, 3)
    var floorOptionAdapter: ArrayAdapter<Int>? = null

    private val files = arrayListOf(
        ProjectFilesModel("A_file", "Architectural", 1),
        ProjectFilesModel("B_file", "Mechanical", 1),
        ProjectFilesModel("C_file", "Electrical", 2),
        ProjectFilesModel("D_file", "Structural", 2),
        ProjectFilesModel("E_file", "Architectural", 2),
        ProjectFilesModel("F_file", "Mechanical", 3),
        ProjectFilesModel("G_file", "Electrical", 3)
    )
    private val adapter by lazy {
        FileDataAdapter().apply {
            items = files
        }
    }

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

        ctypeOptionAdapter =
            ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, ctypeArray)
        ctypeOption.adapter = ctypeOptionAdapter

        floorOptionAdapter =
            ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, floorArray)
        floorOption.adapter = floorOptionAdapter

        ctypeOption.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {}

            override fun onItemSelected(
                parent: AdapterView<*>?,
                view: View?,
                position: Int,
                id: Long
            ) {
                //replace items in adapter to filtered list by selected CType
                //TODO : stored selected ctype & floor and update filtered list logic
                adapter.items = if(position == 0) files else files.filter {
                    it.ctype == ctypeArray[position]
                }
            }
        }

        //TODO : you should implement selected listener as below to filter files by floor 
        floorOption.onItemSelectedListener = ...


        filteredListView.adapter = adapter
        filteredListView.layoutManager = LinearLayoutManager(this)
    }
}

Adicional - combinar dos filtros

conjunto oyente

ctypeOption.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {}

            override fun onItemSelected(
                parent: AdapterView<*>?,
                view: View?,
                position: Int,
                id: Long
            ) {
                invalidateItems()
            }
        }

floorOption.onItemSelectedListener = ... // same as ctypeOption

función invalidate con filtros

private fun invalidateItems() {
    //position == 0 isn't filter items by selected option
    val cTypeFilter: (ProjectFilesModel) -> (Boolean) = { item ->
        if (ctypeOption.selectedItemPosition != 0) item.ctype == ctypeArray[spinner.selectedItemPosition]
        else true
    }
    val floorFilter: (ProjectFilesModel) -> (Boolean) = { item ->
        if (floorOption.selectedItemPosition != 0) item.floor == floorArray[spinner.selectedItemPosition]
        else true
    }

    adapter.items = files.filter { cTypeFilter(it) && floorFilter(it) }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=282781&siteId=1
Recomendado
Clasificación