Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通知OnSwipped方法列表已在mainActivity中排序_Android_Kotlin_Android Recyclerview_Swipe_Itemtouchhelper - Fatal编程技术网

Android 通知OnSwipped方法列表已在mainActivity中排序

Android 通知OnSwipped方法列表已在mainActivity中排序,android,kotlin,android-recyclerview,swipe,itemtouchhelper,Android,Kotlin,Android Recyclerview,Swipe,Itemtouchhelper,我使用recyclerView显示设备中安装的应用程序列表,我实现onSwipe方法来执行卸载…以及排序功能,如名称、大小等 现在,当我根据名称对列表进行排序时,Swipe viewholder…不会刷新 假设在一个列表中…在索引[1]处…有一个画廊应用程序,在 将其排序到索引[10],现在问题是如何思考 画廊位于索引[1],但实际上它显示在中的索引[10]上 回收视图 这里出现的问题是当我在索引[1]上滑动时,它会执行gallery的卸载对话框,但会显示在[10] 如何通知onsweed方法

我使用recyclerView显示设备中安装的应用程序列表,我实现onSwipe方法来执行卸载…以及排序功能,如名称、大小等

现在,当我根据名称对列表进行排序时,Swipe viewholder…不会刷新

假设在一个列表中…在索引[1]处…有一个画廊应用程序,在 将其排序到索引[10],现在问题是如何思考 画廊位于索引[1],但实际上它显示在中的索引[10]上 回收视图

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


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


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
}
适配器1.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()
  }
类适配器(私有变量listOfApps:MutableList):
RecyclerView.Adapter(){
类ViewHolder(appView:View):RecyclerView.ViewHolder(appView){
//从list_apps.xml调用元素
val图标:ImageView=appView.App_图标
val名称:TextView=appView.App_名称
val大小:TextView=appView.App\u大小
}
override onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder{
val view=LayoutInflater.from(parent.context).充气(
R.layout.list_应用程序,父级,false
)
返回视图保持器(视图)
}
重写fun getItemCount()=listOfApps.size
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
val currentItem=listOfApps[位置]
holder.icon.setImageDrawable(currentItem.icon)
holder.name.text=currentItem.name
holder.size.text=currentItem.size
}
趣味更新(新列表:可变列表){
listOfApps=newList
notifyDataSetChanged()
}

我发现您的代码中有一个问题: 您使用的是applicationListonsweed中获得刷卡物品 但在排序之后,您将另一个列表放入适配器。 有两种方法可以解决这个问题

  • 从适配器获取刷卡项目
  • 或者使用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
        }
    

    我在您的代码中看到一个问题: 您使用的是applicationListonsweed中获得刷卡物品 但在排序之后,您将另一个列表放入适配器。 有两种方法可以解决这个问题

  • 从适配器获取刷卡项目
  • 或者使用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
        }
    

    在获得刷卡项目后,然后,,,,,在OnSweep中做什么?此外…按返回单位排序…我需要列表…通过SortedBy获得。如果您使用sortBy,则您不需要列表。您只需通知适配器notifyDataSetChanged,因为应用程序列表本身已排序。您可以共享更新答案的编码示例吗?只需使用此代码即可。我想在这之后,所有东西都会正常工作。在获得刷卡项目之后,,,,,在OnSweep中该怎么办?此外……通过返回单元…我需要列表…通过SortedBy获得。如果您使用sortBy,您不需要列表。您只需通知适配器notifyDataSetChanged,因为应用程序列表本身SortedBy您可以共享编码samp吗我更新了我的答案,用这个代码。我想在这之后一切都会好起来的