Home > Software design >  How can I change recyclerview item background color permanent and transact new Fragment?
How can I change recyclerview item background color permanent and transact new Fragment?

Time:12-04

I want to change the color of recyclervView item that I clicked(so user can understand that already checked the detail of the item) and go detail fragment page. However this background color change must be permanent should I store it in livedata of recycler view items. I share my codes at the end I am new to android programming so please explain your solution for beginner and my english level is not good. Thanks for everything.

class AdapterRecycler() :
    RecyclerView.Adapter<AdapterRecycler.ViewHolder>()


    class ViewHolder(view: View, listener: onItemClickListener) : RecyclerView.ViewHolder(view) {
        val name: TextView = view.findViewById(R.id.gameId)
        val score: TextView = view.findViewById(R.id.scoreId)
        val genre: TextView = view.findViewById(R.id.genres)
        val layout1: RelativeLayout = view.findViewById(R.id.rowlayout)

        init {

            // Define click listener for the ViewHolder's View.
            //val textView : TextView = view.findViewById(R.id.gameId)

            itemView.setOnClickListener {
                layout1.setBackgroundColor(Color.rgb(224,224,224))
                listener.onItemClick(adapterPosition)
           }
        }
    }

    // Create new views (invoked by the layout manager)
    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
        // Create a new view, which defines the UI of the list item
        val view = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.text_row_item, viewGroup, false)

        return ViewHolder(view, listenerItems)
    }

class Games : Fragment() {

    ...

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        ...

        adapter.setOnItemClickListener(object : AdapterRecycler.onItemClickListener {

            override fun onItemClick(position: Int) {

                // Fragment transaction to detail page
                requireActivity().supportFragmentManager.beginTransaction()
                    .replace(R.id.fragmentContainerView2, Details()).commit()
            }
        })
    }

Should I store a boolean value in here to save item checked status?


data class Game(val name : String, val score : Int, val genres : Array<String>)

I tried solution at my codes and I get transaction but not the color changes of item layout.

CodePudding user response:

I think it will be good if you'll update your Game model, after it became checked. Something like this:

data class Game(.., var isChecked: Boolean = false)

And inside your AdapterRecycler.onItemClickListener realization call ViewModel function to update isChecked value:

fun onItemChecked(position: Int) {
    val item = TODO("get item by position from your live data")
    item.isChecked = !item.isChecked
}

In addition, you should override your ViewHolder to setup a background rely on your isCheked value (it will be the same as must be after ViewHolder notify calls):

class ViewHolder(view: View, listener: onItemClickListener) : RecyclerView.ViewHolder(view) {

    ...

    fun bind(item: Game) {
        val backColor = if (item.isChecked) Color.GREEN else Color.BLUE
        layout1.setBackgroundColor(Color.rgb(224,224,224))
    }

}

Call bind function from your AdapterRecycler.onBindViewHolder this way:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.bind(getItem(position), callback)
}

Don't forget to notify your adapter.

CodePudding user response:

Guys thanks to your replies I reviewed my code and got solution. Here is my edit at the code:

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {

        ...
        val color = if (_data[position].isChecked) Color.rgb(224,224,224) else Color.WHITE
        viewHolder.layout1.setBackgroundColor(color)
        ...
    }

That way I change the color of recyclerview item color since I change the fragments make the viewmodel at activity based and used it shared viewModel between fragments

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: GamesViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
       
...
 
        viewModel = ViewModelProvider(this)[GamesViewModel::class.java]

...
}

Then I added the boolean variable to my model.

data class Game(val name : String, val score : Int, val genres : Array<String>, var isChecked : Boolean = false)

Then I change the liveData's attribute of isChecked at the click listener.

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        adapter.setOnItemClickListener(object : AdapterRecycler.onItemClickListener {

            override fun onItemClick(position: Int) {

                viewModel= ViewModelProvider(requireActivity()).get(GamesViewModel::class.java)
                val item = viewModel.liveData.value!!.get(position)
                item.isChecked = true
                // toGo next fragment
                requireActivity().supportFragmentManager.beginTransaction()
                    .replace(R.id.fragmentContainerView2, Details()).commit()
            }

        })

Voilà we got the perfect result thanks for helping me, have a great day.

  • Related