没有从回收器视图中删除项目



我正在我的android应用程序中构建一个函数,用户将在其中将两个项目匹配在一起如果两个项目彼此匹配,则正确的图标将显示给你点击匹配的项目,如果你的匹配是错误的,则显示给你错误的图标。有一个条件是,当匹配正确时,两个正确的项目都会被删除。我尝试了各种方法来删除,但它们似乎并不完美。

匹配是基于语言的,它是一个语言翻译应用程序,假设你试图翻译你是如何(engilsh(->至->注释vas tu(法语(在这种情况下,如果这些计数值匹配,则意味着它们属于彼此,因此它的正确

我从活动中提供的count的值,在活动中我将值添加到matchdataholder,通过循环count变量将ist lang(英语文本(保存在count 1,第二语言(法语(也保存到count 1,但具有不同的索引

活动类

package com.blablacards.activity
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.recyclerview.widget.GridLayoutManager
import com.blablacards.R
import com.blablacards.adapter.MatchAdapter
import com.blablacards.app.retrofit.ApiCall
import com.blablacards.model.FavListItem
import com.blablacards.model.MatchDataHolder
import com.blablacards.model.MatchList
import com.blablacards.model.ResponseFavList
import com.blablacards.utils.AppPref
import com.blablacards.utils.Constants
import kotlinx.android.synthetic.main.activity_match.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class MatchActivity : BaseActivity(), View.OnClickListener {
var matchDataHolder: ArrayList<MatchDataHolder>? = ArrayList<MatchDataHolder>()
var favWordList = ArrayList<FavListItem>()
var matchList = ArrayList<MatchList>()
var categoryId: Int? = null
var categoryName: String? = null
lateinit var matchAdapter: MatchAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_match)
img_back.setOnClickListener(this)
getBundleData()
tv_header.text = categoryName
favWordList.clear()
calFavCategoryListApi("DESC")
// setAdapter()
}
private fun setAdapter(favWordList: ArrayList<MatchDataHolder>) {
Toast.makeText(this@MatchActivity, "Adapter called", Toast.LENGTH_SHORT).show()
matchAdapter = MatchAdapter(
this@MatchActivity,
favWordList
)
println("FAV LIST SIZE ->" + favWordList.size)
rv_match.layoutManager = GridLayoutManager(this@MatchActivity, 2)
rv_match.adapter = matchAdapter
}
private fun getBundleData() {
val extras = intent.extras
if (extras != null) {
categoryId = extras.getInt("CategoryId")
categoryName = extras.getString("CategoryName")
println("!!!categoryId = ${categoryId}")
}
}
private fun calFavCategoryListApi(sortBy: String) {
ApiCall.initApiCall(Constants.BASE_URL).getFavcategoryList(
"Bearer" + AppPref.getValue(AppPref.TOKEN, ""),
AppPref.getValue(AppPref.LOGIN_ID, "")!!, categoryId.toString(), "", "", sortBy
).enqueue(object : Callback<ResponseFavList> {
override fun onResponse(
call: Call<ResponseFavList>,
response: Response<ResponseFavList>
) {
if (response.isSuccessful) {
if (response.body()!!.status!!) {
favWordList.addAll(response.body()!!.data!!)
//
for (i in 0 until favWordList.size) {
matchDataHolder!!.add(MatchDataHolder(favWordList[i].sended_text.toString(),i))
matchDataHolder!!.add(MatchDataHolder(favWordList[i].return_text.toString(),i))
}
for(i in 0 until matchDataHolder!!.size){
println("DATA HOLDER ->"+ matchDataHolder!![i].text)
println("DATA HOLDER  Count->"+ matchDataHolder!![i].count)
}
//
setAdapter(matchDataHolder!!)
} else {
showSnackBar(response.message())
}
}
}
override fun onFailure(call: Call<ResponseFavList>, t: Throwable) {
println("!!!t.message = ${t.message}")
}
})
}
override fun onClick(v: View?) {
when (v!!.id) {
R.id.img_back -> {
onBackPressed()
}
}
}
}

适配器类

package com.blablacards.adapter
import android.content.Context
import android.os.Handler
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.blablacards.R
import com.blablacards.model.MatchDataHolder
import kotlinx.android.synthetic.main.row_match.view.*
class MatchAdapter(
var context: Context,
var favWordList: ArrayList<MatchDataHolder>,
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var index1 = -1
var index2 = -1
var enabledFlag = false
var oldPos = -1
var newPos = -1
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return ViewHolder(
LayoutInflater.from(context)
.inflate(R.layout.row_match, parent, false)
)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
(holder as MatchAdapter.ViewHolder).bind(position)
holder.itemView.rl_match.setBackgroundColor(context.resources.getColor(R.color.white))
holder.itemView.tv_match.visibility = View.VISIBLE
holder.itemView.rl_match.setOnClickListener(View.OnClickListener {
if (!enabledFlag) {
println(enabledFlag)
println("IF block")
it.rl_match.setBackgroundColor(context.resources.getColor(R.color.orange_light3))
holder.itemView.tv_match.visibility = View.INVISIBLE
oldPos = favWordList[position].count
println("OLD POS ->" + oldPos)
index1 = position
println("index 1 = " + index1)
enabledFlag = true
} else {
// show the correct and wrong //
println("ELSE BLOCK")
enabledFlag = false
newPos = favWordList[position].count
println("NEW POS ->" + newPos)
index2 = position
println("index 2 = " + index2)
showCorrectOrFalse(holder.itemView, favWordList[position].count)
}
})
}
override fun getItemCount(): Int {
return favWordList.size
}

private fun timeHandler(itemView: View, status: String, position: Int) {
Handler().postDelayed({
if (status == "right") {
println("inside right")
itemView.tv_match.visibility = View.VISIBLE
itemView.rl_match.setBackgroundColor(context.resources.getColor(R.color.white))
itemView.img_right_or_wrong.visibility = View.INVISIBLE
//                favWordList.drop(index1)
//                favWordList.drop(index2)
/// THE PROBLEM IS HERE CUZ I'm not able to perfectly removed the item//
favWordList.remove(MatchDataHolder(favWordList[index1].text,newPos))
favWordList.remove(MatchDataHolder(favWordList[index2].text,oldPos))
notifyItemRemoved(index1)
notifyItemRemoved(index2)
notifyItemRangeChanged(index1,favWordList.size)
notifyItemRangeChanged(index2,favWordList.size)
notifyDataSetChanged()
}
if (status == "wrong") {
println("Inside wrong")
itemView.tv_match.visibility = View.VISIBLE
itemView.rl_match.setBackgroundColor(context.resources.getColor(R.color.white))
itemView.img_right_or_wrong.visibility = View.INVISIBLE
notifyDataSetChanged()
}
}, 2000)
}
private fun showCorrectOrFalse(itemView: View, position: Int) {
println("SHOW CORRECT CALLED")
//call handler after click //
println("OLD POS " + oldPos + " New POS " + newPos)
if (oldPos == newPos) {
itemView.img_right_or_wrong.setImageDrawable(context.resources.getDrawable(R.drawable.right_game))
Toast.makeText(context, "true", Toast.LENGTH_SHORT).show()
timeHandler(itemView, "right", position)
} else {
itemView.img_right_or_wrong.setImageDrawable(context.resources.getDrawable(R.drawable.wrong_game))
timeHandler(itemView, "wrong", position)
}
}
internal inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind(position: Int) {
itemView.findViewById<TextView>(R.id.tv_match).text =
favWordList[position].text
}
}
}

用于保存项目数据的模型类

class MatchDataHolder(text:String,num:Int) {
var count = num
var text =text
}
favWordList.remove(MatchDataHolder(favWordList[index1].text,newPos))

删除favWordList中不存在的新MatchDataHolder

你可以试试这个:

favWordList.removeAt(index1)

最新更新