Android 通知OnSwipped方法列表已在mainActivity中排序
我使用recyclerView显示设备中安装的应用程序列表,我实现onSwipe方法来执行卸载…以及排序功能,如名称、大小等 现在,当我根据名称对列表进行排序时,Swipe viewholder…不会刷新 假设在一个列表中…在索引[1]处…有一个画廊应用程序,在 将其排序到索引[10],现在问题是如何思考 画廊位于索引[1],但实际上它显示在中的索引[10]上 回收视图 这里出现的问题是当我在索引[1]上滑动时,它会执行gallery的卸载对话框,但会显示在[10]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方法
如何通知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()
}
我发现您的代码中有一个问题:
您使用的是applicationList在onsweed中获得刷卡物品
但在排序之后,您将另一个列表放入适配器。
有两种方法可以解决这个问题
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
}
我在您的代码中看到一个问题: 您使用的是applicationList在onsweed中获得刷卡物品 但在排序之后,您将另一个列表放入适配器。 有两种方法可以解决这个问题
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吗我更新了我的答案,用这个代码。我想在这之后一切都会好起来的