I have an array list of integers[3,-3,7,9,8,1].
What I am trying to do is to get the same numbers that are positive and negative and make them type 1. For example, The number "3" and "-3" will be type 1 and all the others will be type 2.
I did like the following:
override fun getItemViewType(position: Int): Int {
val positiveArray = ArrayList<Int>()
val negativeArray = ArrayList<Int>()
val currentNumber = numberList[position]
Log.e("getItemViewType","currentNumber= ${currentNumber.singleNumber}")
for (number in numberList){
if (number.singleNumber > 0){
positiveArray.add(number.singleNumber)
}else{
negativeArray.add(number.singleNumber)
}
}
Log.e("positiveArray","Result: $positiveArray")
Log.e("negativeArray","Result: $negativeArray")
return if (positiveArray.contains(currentNumber.singleNumber) && negativeArray.contains(-currentNumber.singleNumber)) { // put your condition, according to your requirements
Log.e("getItemViewType","Contains Both = ${currentNumber.singleNumber}")
RED_ROW
} else{
ORANGE_ROW
}
}
So the problem here is that when I run the app with this code,its only mark "3" as type 1 but the "-3" is type 2.
Edit:
Full adapter class:
class MainRecyclerViewAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object {
private const val ORANGE_ROW = 1
private const val RED_ROW = 2
}
private lateinit var numberList : List<SingleNumber>
inner class RedRowViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
private lateinit var redTextView : TextView
fun bindRedRow(singleNumber: Int) {
redTextView = itemView.findViewById<TextView>(R.id.redNumberTextView)
redTextView.text = singleNumber.toString()
}
}
inner class OrangeRowViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
private lateinit var orangeTextView : TextView
fun bindOrangeRow(singleNumber: Int) {
orangeTextView = itemView.findViewById<TextView>(R.id.orangeNumberTextView)
orangeTextView.text = singleNumber.toString()
}
}
override fun getItemViewType(position: Int): Int {
val positiveArray = ArrayList<Int>()
val negativeArray = ArrayList<Int>()
val currentNumber = numberList[position]
Log.e("getItemViewType","currentNumber= ${currentNumber.singleNumber}")
for (number in numberList){
if (number.singleNumber > 0){
positiveArray.add(number.singleNumber)
}else{
negativeArray.add(number.singleNumber)
}
}
Log.e("positiveArray","Result: $positiveArray")
Log.e("negativeArray","Result: $negativeArray")
return if (positiveArray.contains(currentNumber.singleNumber) && negativeArray.contains(-currentNumber.singleNumber)) { // put your condition, according to your requirements
Log.e("getItemViewType","Contains Both = ${currentNumber.singleNumber}")
RED_ROW
} else{
ORANGE_ROW
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return if (viewType == RED_ROW){
val redRow = LayoutInflater.from(parent.context).inflate(R.layout.red_row,parent,false)
RedRowViewHolder(redRow)
}else{
val orangeRow = LayoutInflater.from(parent.context).inflate(R.layout.orange_row,parent,false)
OrangeRowViewHolder(orangeRow)
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (getItemViewType(position) == RED_ROW){
(holder as RedRowViewHolder).bindRedRow(numberList[position].singleNumber)
} else{
(holder as OrangeRowViewHolder).bindOrangeRow(numberList[position].singleNumber)
}
}
override fun getItemCount(): Int {
return if (this::numberList.isInitialized){
numberList.size
} else 0
}
fun setList(newList : List<SingleNumber>){
Log.e("ListSet","ListsET $newList")
numberList = newList
notifyDataSetChanged()
}
}
How can I overcome this ? Do you think its build in the right way or you would do something different ? Thank you !
CodePudding user response:
Your return value isn't checking the value of the item. It's checking whether it's positive or negative. So all your items are going to return one of two values.
If you want one group for the absolute value of each item, the easiest thing to do is:
override fun getItemViewType(position: Int): Int {
return Math.abs(numberList[position])
}
Why this works: you don't need to start from 0, you just need to return a unique id per view type that you can map to quickly. The absolute value of the number is unique, since both 1 and -1 map to the same group for every value. So we just return that.
CodePudding user response:
This is wheat I have done:
override fun getItemViewType(position: Int): Int {
val currentNumber = abs(numberList[position].singleNumber)
val positiveArray = ArrayList<Int>()
val negativeArray = ArrayList<Int>()
for (number in numberList){
if (number.singleNumber > 0){
positiveArray.add(number.singleNumber)
}else{
negativeArray.add(abs(number.singleNumber))
}
}
return if (positiveArray.contains(currentNumber) && negativeArray.contains(currentNumber)){
1
}else{
2
}
}
Tnx to @GabeSechan I now know what is "abs",its making negative numbers positive.
I created 2 lists,1 for the negative and 1 for the positive(notice that when I adding the negative value,I use "abs".
After that I check the numbers in both lists,if its exist the type is 1,if not,the type is 2.
