【问题标题】:Get the CardView in RecyclerView from Activity从Activity中获取RecyclerView中的CardView
【发布时间】:2020-04-08 19:42:47
【问题描述】:

我是 Android 开发新手。我有一个问题。在我的应用程序中,我有 10 个项目的 RecyclerView,我需要更改所选项目的颜色。 这是我的适配器:

class TestAdapter(val test : ArrayList<Test>, private val testAdapterCallback: (Test, Int)-> Unit) : RecyclerView.Adapter<TestAdapter.ViewHolder>(){

    var index : Int = -1

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

        val v = LayoutInflater.from(parent.context).inflate(R.layout.test_view_item, parent, false)

        return ViewHolder(v)

    }

    override fun getItemCount(): Int {
        return test.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val num : Test = test[position]
        holder.textView.text = num.id.toString()

        val colorSelected : Int = holder.cardView.getContext().getResources().getColor(R.color.colorSelected)
        val colorItem : Int = holder.cardView.getContext().getResources().getColor(R.color.colorItem)

        holder.cardView.setOnClickListener(){
            testAdapterCallback(num, position)
            index=position
            notifyDataSetChanged()
        }


        if (index!=-1){
            if(index==position){
                holder.cardView.setCardBackgroundColor(colorSelected)
            }
            else{
                holder.cardView.setCardBackgroundColor(colorItem)
            }
        }

    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){

        val cardView = itemView.findViewById<CardView>(R.id.testCardView)
        val textView = itemView.findViewById<TextView>(R.id.testTextView)

    }

}

而且它正在工作。但是在我的活动中,我有一个按钮可以切换到 RecyclerView 中的下一个项目。此外,我的适配器中有回调,返回所选项目的位置。

class TestActivity : AppCompatActivity() {

    private lateinit var urlToTest: String
    private val list = ArrayList<Test>()
    private var randomList = ArrayList<Test>()
    private var currentItem = 0
    private var fragmentsList = ArrayList<Fragment>()

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

        val title = getIntent().getStringExtra("TestTitle")
        setTitle(title)

        urlToTest = "http://sasmobile.ru" + getIntent().getStringExtra("urlToJson") + getIntent().getStringExtra("jsonName")


        val recView = findViewById<RecyclerView>(R.id.testRecyclerView)
        recView.layoutManager = LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)

        val connector = Connector().isConnectedToNetwork(this)
        val submitButton: Button = findViewById(R.id.submitButton)

        if (connector) {
            AsyncTaskHandler().execute(urlToTest)

                submitButton.setOnClickListener {
                    if (currentItem != 9) {
                        currentItem += 1
                        testAdapterItemClick(randomList[currentItem], currentItem)

                        if (currentItem == 9) {
                            submitButton.setOnClickListener() {
                                val adapter =
                                    TestCheckAdapter(randomList) { item, position ->
                                        testAdapterItemClick(item, position)
                                    }

                                recView.adapter = adapter
                            }
                        }
                    }
            }
        }
        else{
            submitButton.visibility=View.INVISIBLE
            openAlertDialog()
        }


    }


    private fun openAlertDialog(){
        val dialogBuilder = AlertDialog.Builder(this)
        val connector = Connector().isConnectedToNetwork(this)

        dialogBuilder.setMessage("Check your Internet connection")
            .setCancelable(false)

            .setPositiveButton("Try again", DialogInterface.OnClickListener{
                    dialog, id -> if (connector) {
                dialog.cancel()
                AsyncTaskHandler().execute(urlToTest)
            }
            else openAlertDialog()
            })


        val alertBox = dialogBuilder.create()
        alertBox.setTitle("Ooops")
        alertBox.show()
    }


    private fun testAdapterItemClick(item: Test, currI : Int) {

        val fT: FragmentTransaction = supportFragmentManager.beginTransaction()

        currentItem = currI

        val recView : RecyclerView = findViewById(R.id.testRecyclerView)
        val layoutManager = LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)
        layoutManager.scrollToPositionWithOffset(currentItem-5, 0)
        recView.layoutManager=layoutManager


        val submitButton : Button = findViewById(R.id.submitButton)
        if (currentItem<9){
            submitButton.text="Next Questions"
        }
        if (currentItem==9){
            submitButton.text="Finish Test"
        }



        if (item.typeQuestion == "input") {
            val bundle = Bundle()
            bundle.putParcelable("ITEM", item)

            if(!item.questionImageSrc.isNullOrEmpty())
                bundle.putString("IMAGE_KEY", item.questionImageSrc)

            fragmentsList[currentItem].setArguments(bundle)
            if (!fragmentsList[currentItem].isAdded())
                fT.add(R.id.frameLayout, fragmentsList[currentItem])
            if (fragmentsList[currentItem].isAdded())
                fT.replace(R.id.frameLayout, fragmentsList[currentItem])
        }


        if (item.typeQuestion == "singleChoice") {
            val bundle = Bundle()
            bundle.putParcelable("ITEM", item)

            val count = item.singleChoiceAnswers.count()
            bundle.putInt("COUNT_KEY", count)

            fragmentsList[currentItem].setArguments(bundle)

            if (!fragmentsList[currentItem].isAdded())
                fT.add(R.id.frameLayout, fragmentsList[currentItem])
            if (fragmentsList[currentItem].isAdded())
                fT.replace(R.id.frameLayout, fragmentsList[currentItem])
        }

        if (item.typeQuestion == "multipleChoice") {
            val bundle = Bundle()
            bundle.putParcelable("ITEM", item)

            val count = item.multipleChoiceAnswers.count()
            bundle.putInt("COUNT_KEY", count)

            fragmentsList[currentItem].setArguments(bundle)

            if (!fragmentsList[currentItem].isAdded())
                fT.add(R.id.frameLayout, fragmentsList[currentItem])
            if (fragmentsList[currentItem].isAdded())
                fT.replace(R.id.frameLayout, fragmentsList[currentItem])
        }

        fT.addToBackStack(null)
        fT.commit()

    }

请帮帮我,如何在不按项目的情况下更改颜色?

提前致谢)

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    呼叫:

    adapter.index = 5
    adapter.notifyDataSetChanged()
    

    val oldIndex = adapter.index
    adapter.index = 5
    adapter.notifyItemChanged(oldIndex)
    adapter.notifyItemChanged(5)
    

    【讨论】:

    • 在哪里?在 AdapterItemClick 中?
    • 我会将它放在适配器内部的公共方法中,并在我需要设置高亮项目时调用它,例如在 adapterItemClick 回调中。
    • 好的,我明白了,但我不知道如何从活动中获得持有人
    • 您不应该从活动中获取持有人,您将通知适配器数据已更改(notifyDataSetChanged)并且它将重新绑定持有人,因此将再次调用onBindViewHolder,但这次索引将是不同所以它会设置不同的setCardBackgroundColor
    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多