gpt4 book ai didi

android - 通知 onSwiped 方法列表在 mainActivity 中排序

转载 作者:行者123 更新时间:2023-12-02 13:41:11 25 4
gpt4 key购买 nike

我正在使用 recyclerView 显示设备中安装的应用程序列表,我实现了 onSwipe 方法来执行卸载 ....以及名称、大小等排序功能。
现在,当我根据名称 onswipe viewholder 对列表进行排序时......不刷新

Suppose in a list ...at index[1]...gallery app is there, aftersorting this goes to index[10] now the problem is onSwipe method thinkgallery is at index[1], but actually it is displayed on index[10] inrecyclerView ..


这里出现的问题是当我在 index[1] 上滑动时,它会执行图库的卸载对话框,但它显示在 [10]

如何通知 onSwiped 方法列表已排序并且每个项目都更改其索引

MainActivity.kt
class MainActivity : AppCompatActivity() {

lateinit var adapter: Adapter // create adapter instance
lateinit var applicationList:MutableList<AppData>

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

applicationList = getApps(installedApps()) // initialize applicationList variable
recyclerView.layoutManager = LinearLayoutManager(this)
adapter = Adapter(applicationList) // initialize adapter variable
recyclerView.adapter = adapter // pass adapter to recyclerView

sortList()

// I create sepearate abstract class SwipeToDeleteCallback and call here

val swipeHandler = object : SwipeToDeleteCallback(this) {
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
currentItem = viewHolder.adapterPosition
val packageName =
applicationList[currentItem].packageName // get packageName from position
val appCategory = applicationList[currentItem].category

uninstall() // call uninstall function
}

}
val itemTouchHelper = ItemTouchHelper(swipeHandler)
itemTouchHelper.attachToRecyclerView(recyclerView) // attach onSwipe to recyclerView

}

fun uninstall(){
// perform uninstall
}

private fun installedApps(): MutableList<ResolveInfo> {
// get installed apps
}

fun sortList() {
Sort_List.setOnClickListener {
val popUp = PopupMenu(this, Sort_List)
popUp.menuInflater.inflate(R.menu.sort_menu, popUp.menu)

popUp.setOnMenuItemClickListener { myItem ->
when (myItem.itemId) {
R.id.Name_ASC -> {

val sortedList = applicationList.sortedBy { it.name }
adapter.update(sortedList)
}
R.id.Name_DES -> {
val sortedList = applicationList.sortedByDescending { it.name }
adapter.update(sortedList)
}
}
true
}
popUp.show()
}
}


private fun getApps(List: MutableList<ResolveInfo>): MutableList<AppData> {

// fetch all apps and return list
}
SwipeToDeleteCallback.kt
abstract class SwipeToDeleteCallback(context: Context) : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {

private val deleteIcon = ContextCompat.getDrawable(context, R.drawable.ic_delete_white)
private val intrinsicWidth = deleteIcon?.intrinsicWidth
private val intrinsicHeight = deleteIcon?.intrinsicHeight
private val background = ColorDrawable()
private val backgroundColor = Color.parseColor("#f44336")
private val clearPaint = Paint().apply { xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR) }


override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
return super.getMovementFlags(recyclerView, viewHolder)
}

override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}

override fun onChildDraw(
c: Canvas,
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
dX: Float,
dY: Float,
actionState: Int,
isCurrentlyActive: Boolean
) {
val itemView = viewHolder.itemView
val itemHeight = itemView.bottom - itemView.top
val isCanceled = dX == 0f && !isCurrentlyActive

if (isCanceled){
clearCanvas(c,itemView.right + dX, itemView.top.toFloat(), itemView.right.toFloat(), itemView.bottom.toFloat())
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
}

// Draw the red delete button

//Calculate position of delete icon

// Draw the delete icon

super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
}

private fun clearCanvas(c: Canvas?, left: Float, top: Float, right: Float, bottom: Float) {
c?.drawRect(left, top, right, bottom, clearPaint)
}
适配器.kt
class Adapter(private var listOfApps: MutableList<AppData>) :
RecyclerView.Adapter<Adapter.ViewHolder>() {

class ViewHolder(appView: View) : RecyclerView.ViewHolder(appView) {

// call elements from list_apps.xml
val icon: ImageView = appView.App_icon
val name: TextView = appView.App_name
val size: TextView = appView.App_size
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(
R.layout.list_apps, parent, false
)
return ViewHolder(view)
}

override fun getItemCount() = listOfApps.size

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

val currentItem = listOfApps[position]
holder.icon.setImageDrawable(currentItem.icon)
holder.name.text = currentItem.name
holder.size.text = currentItem.size

}
fun update(newList: MutableList<AppData>){
listOfApps = newList
notifyDataSetChanged()
}

最佳答案

我在您的代码中看到了一个问题:
您正在使用 应用列表 中获取刷过的项目onSwiped
但是在排序之后,您将另一个列表放入适配器。
有两种方法可以解决这个问题

  • 从适配器获取刷过的元素
  • 或使用 排序依据 () 而不是 排序依据 () 用于排序列表

  • 修改 fragment 为
    popUp.setOnMenuItemClickListener { myItem ->
    when (myItem.itemId) {
    R.id.Name_ASC -> {

    applicationList.sortBy{ it.name }
    adapter.notifyDataSetChanged()
    }
    R.id.Name_DES -> {
    applicationList.sortByDescending{ it.name }
    adapter.notifyDataSetChanged()
    }
    }
    true
    }

    关于android - 通知 onSwiped 方法列表在 mainActivity 中排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63357399/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com