如何解决通知onSwiped方法列表已在mainActivity中排序
我正在使用recyclerView来显示设备中安装的应用程序列表,我实现了onSwipe方法来执行卸载....以及诸如名称,大小等排序功能。
现在,当我根据名称在滑动查看器上对列表进行排序时...不刷新
假设在列表中……在索引[1] ...之后,有画廊应用程序 排序到索引[10]现在问题是onSwipe方法认为 图库位于索引[1],但实际上它显示在索引[10]中 recyclerView ..
问题发生在这里是当我在索引[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,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,isCurrentlyActive)
}
private fun clearCanvas(c: Canvas?,left: Float,top: Float,right: Float,bottom: Float) {
c?.drawRect(left,top,right,bottom,clearPaint)
}
Adapter.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()
}
解决方法
我在您的代码中看到一个问题: 您正在使用 applicationList 在 onSwiped 中获取滑动项 但排序后,您将另一个列表放入适配器。 有两种方法可以解决此问题
- 从适配器获取刷卡项目
- 或使用 sortBy ()代替 sortedBy ()进行排序
修改片段到
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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。