Java Android ListView.notifyDataSetChanged导致不正确的行

Java Android ListView.notifyDataSetChanged导致不正确的行,java,android,kotlin,android-listview,Java,Android,Kotlin,Android Listview,我正在从事一个android项目,其中一个ListFragment正在从一个子活动更新。但是,尽管更新后元素的计数正确,但元素本身却不正确。不正确的元素被放入列表并相互复制 问题是,在子活动修改文件并调用populate()函数,然后返回到片段所在的主活动之后,问题出现了。 例如,在开始时,它们的顺序如下:[1,2,3] 现在,子活动中的文件操作将删除项“1”(不是直接调用remove,而是删除该文件,populate()函数(如下所列)将生成一个不包含该元素的列表),它应该变成[2,3]。但是

我正在从事一个android项目,其中一个ListFragment正在从一个子活动更新。但是,尽管更新后元素的计数正确,但元素本身却不正确。不正确的元素被放入列表并相互复制

问题是,在子活动修改文件并调用populate()函数,然后返回到片段所在的主活动之后,问题出现了。 例如,在开始时,它们的顺序如下:
[1,2,3]

现在,子活动中的文件操作将删除项“1”(不是直接调用remove,而是删除该文件,
populate()
函数(如下所列)将生成一个不包含该元素的列表),它应该变成
[2,3]
。但是它变成了
[1,2]

通过按钮调用完全刷新后,包括清除和重新填充
MetadataManager.packMap
PackListManager.onlineList
PackListManager.localList
,然后重新启动MainActivity,它将恢复正常

现在我们有了
[2,3]
。子活动中的另一个文件操作应返回“1”,并且它应再次变为
[1,2,3]
。但是,它变成了
[2,3,3]

这些元素来自单例中的ArrayList。这是ListFragment的类:

class PackListFragment : ListFragment() {

    private lateinit var dataList: ArrayList<PackageMetadata>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val index = arguments?.getInt(ARG_SECTION_NUMBER) ?: 1
        if (index == 1){
            dataList = PackListManager.onlineList
        } else {
            dataList = PackListManager.localList
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val adapter = PackMetadataAdapter(activity as Context, dataList)
        listAdapter = adapter
        return inflater.inflate(R.layout.fragment_main, container, false)
    }

    override fun onResume() {
        (listAdapter as ArrayAdapter<PackageMetadata>).notifyDataSetChanged()
        super.onResume()
    }
类PackListFragment:ListFragment(){
私有lateinit var数据列表:ArrayList
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
val index=参数?.getInt(参数节号)?:1
如果(索引==1){
dataList=PackListManager.onlineList
}否则{
dataList=PackListManager.localList
}
}
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看{
val adapter=packmetadapter(活动作为上下文,数据列表)
listAdapter=适配器
返回充气机。充气(右布局图。主容器,假)
}
重写onResume(){
(listAdapter作为ArrayAdapter).notifyDataSetChanged()
super.onResume()
}
我的ListView使用自定义适配器。这是适配器:

class PackMetadataAdapter (context : Context, val values : List<PackageMetadata>)
    : ArrayAdapter<PackageMetadata>(context, -1, values) {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        if (convertView == null) {
            val inflater = context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
            /*val rowView : View = inflater.inflate(android.R.layout.simple_list_item_1, parent, false)
            val text1 = rowView.findViewById(android.R.id.text1) as TextView
            text1.text = values[position].Name_LO*/
            val metadata = values[position]
            val rowView: View = inflater.inflate(R.layout.listitem_route, parent, false)
            val textTitle = rowView.findViewById<View>(R.id.textTitle) as TextView
            val textAuthor = rowView.findViewById(R.id.textAuthor) as TextView
            val textVersion = rowView.findViewById(R.id.textVersion) as TextView
            val textTimestamp = rowView.findViewById(R.id.textTimestamp) as TextView
            val imageView: ImageView = rowView.findViewById<View>(R.id.imageThumbnail) as ImageView
            textTitle.text = metadata.Name_LO
            textAuthor.text = metadata.Author.Name_LO
            textVersion.text = metadata.Version.get()
            textTimestamp.text = SimpleDateFormat("yyyy-MM-dd", Locale.US)
                .format(values[position].Timestamp)
            DownloadImageTask(imageView).execute(metadata.Thumbnail)
            return rowView
        }
        return convertView
    }

}
类packmetadapter(上下文:上下文,val值:列表)
:ArrayAdapter(上下文,-1,值){
覆盖视图(位置:Int,convertView:View?,父级:ViewGroup):视图{
if(convertView==null){
val充气器=上下文
.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE)作为LayoutInflater
/*val rowView:View=充气机。充气(android.R.layout.simple_list_item_1,父项,false)
val text1=rowView.findviewbyd(android.R.id.text1)作为TextView
text1.text=值[位置]。名称\u LO*/
val元数据=值[位置]
val rowView:View=充气机。充气(R.layout.listitem_路线,父项,false)
val textTitle=rowView.findViewById(R.id.textTitle)作为TextView
val textAuthor=rowView.findViewById(R.id.textAuthor)作为TextView
val textVersion=rowView.findViewById(R.id.textVersion)作为TextView
val textTimestamp=rowView.findViewById(R.id.textTimestamp)作为TextView
val imageView:imageView=rowView.findViewById(R.id.IMAGE缩略图)作为imageView
text title.text=metadata.Name\u LO
text Author.text=metadata.Author.Name\u LO
textVersion.text=元数据.Version.get()
textTimestamp.text=SimpleDataFormat(“yyyy-MM-dd”,Locale.US)
.format(值[位置].时间戳)
下载ImageTask(imageView).execute(metadata.缩略图)
返回行视图
}
返回转换视图
}
}
单例中的列表如下所示:

object PackListManager {
    const val LOGCAT_TAG = "BCSPackListMan"
    val localList : ArrayList<PackageMetadata> = ArrayList()
    var onlineList : ArrayList<PackageMetadata> = ArrayList()

    fun populate(){
        localList.clear(); onlineList.clear()
        val localPacks = HashMap(PackLocalManager.getLocalPacks().map {
            val parts = stripExtension(it.nameWithoutExtension).split("_")
            if (parts.count() > 1) {
                parts[0] to Version(parts[1])
            } else {
                it.nameWithoutExtension to Version("0.0")
            }
        }.toMap())
        for (pack in MetadataManager.packMap){
            if (localPacks.containsKey(pack.key)){
                Log.i(LOGCAT_TAG, "Pack "+pack.key+" found on local disk")
                if (localPacks[pack.key]!! < pack.value.Version){
                    Log.i(LOGCAT_TAG, "Pack "+pack.key+" can be updated")
                }
                localPacks.remove(pack.key)
                localList.add(pack.value)
            } else {
                Log.i(LOGCAT_TAG, "Pack "+pack.key+" not installed")
                onlineList.add(pack.value)
            }
        }
    }
objectpacklistmanager{
const val LOGCAT_TAG=“BCSPackListMan”
val localList:ArrayList=ArrayList()
var onlineList:ArrayList=ArrayList()
乐趣(){
localList.clear();onlineList.clear()
val localPacks=HashMap(PackLocalManager.getLocalPacks().map{
val parts=stripExtension(it.nameWithoutExtension.split(“\ux”)
如果(parts.count()>1){
部件[0]到版本(部件[1])
}否则{
it.name未扩展到版本(“0.0”)
}
}.toMap())
用于(在MetadataManager.packMap中打包){
if(localPacks.containsKey(pack.key)){
Log.i(LOGCAT_标签,“Pack”+Pack.key+“在本地磁盘上找到”)
if(localPacks[pack.key]!!
通过检查logcat,我可以说由
polate()
函数生成的列表是正确的,而如果没有调用上述手动刷新,MetadataManager.packMap shuld将保持不变

我在谷歌上搜索过这样的问题,但我似乎找不到一个好的答案。我真的很抱歉发布这么长的代码,但我真的无法自己解决。任何帮助都将不胜感激


顺便说一句,我不是母语人士,因此对帖子中的错误感到抱歉。

不要使用
ListView
,因为它已经过时,请不要使用此try
RecyclerView

不要使用ListView,因为它已经过时,请不要使用此tryRecyclerView@KostyaBakay谢谢!将ListView替换为RecyclerView后