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