Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.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 对象的arraylist:对arraylist排序后,它会将listview的内容弄乱_Android - Fatal编程技术网

Android 对象的arraylist:对arraylist排序后,它会将listview的内容弄乱

Android 对象的arraylist:对arraylist排序后,它会将listview的内容弄乱,android,Android,基本上,我有一个微调器,您可以在其中对列表视图进行排序,我正在使用该代码进行排序: if(arg2==0) { Sorting_class.QueueSort(mList); } else if(arg2==1) { Sorting_class.AlphaSort(mList); } 在对列表进行排序和记录之后,它看起来已排序,没有任何问题!但只要我调用adapter.notifydatasetchanged它就会出错,例如,它会用第一个元素覆盖最后一个元素的信息。 如果我的

基本上,我有一个
微调器
,您可以在其中对
列表视图进行排序,我正在使用该代码进行排序:

 if(arg2==0)
{
    Sorting_class.QueueSort(mList);
}
else if(arg2==1)
{
    Sorting_class.AlphaSort(mList);
}
在对列表进行排序和记录之后,它看起来已排序,没有任何问题!但只要我调用
adapter.notifydatasetchanged
它就会出错,例如,它会用第一个元素覆盖最后一个元素的信息。 如果我的对象具有如下字符串名称:

z
s
a
a
s
a
a
a
a
调用alpha sort后,从
logcat
中可以看到:

a
s
z
但是在调用
adapter.notifydatasetchanged
以显示新信息后,如下所示:

z
s
a
a
s
a
a
a
a
每次排序之后,它都会继续这样做,直到所有元素都得到相同的信息。第二次排序后,我的listview如下所示:

z
s
a
a
s
a
a
a
a
这是我用于排序的代码:

public static void QueueSort(ArrayList<item_base> mList)
    {
        Collections.sort(mList, new Comparator<item_base>() {

            @Override
            public int compare(item_base lhs, item_base rhs) {
                return lhs.GetTimeMil() < rhs.GetTimeMil() ? -1 : 1;
            }
        });
    }

    public static void AlphaSort(ArrayList<item_base> mList)
    {
        Collections.sort(mList, new Comparator<item_base>() {

            @Override
            public int compare(item_base lhs, item_base rhs) {
                return lhs.getmName().compareTo(rhs.getmName());
            }
        });
    }
我找到的唯一解决方案是在每次排序后再次设置适配器:

mAdapter = new Listview_customAdapter(getActivity(), mList, R.layout.listview_shopping);
                mListView.setAdapter(mAdapter);

排序
然后设置适配器

我是说在这里之后:

if(arg2==0)
{
    Sorting_class.QueueSort(mList);
}
else if(arg2==1)
{
    Sorting_class.AlphaSort(mList);
}

//Set the adapter here (after sorting has occured)
mAdapter=new Listview_customAdapter(getActivity(),mList,R.layout.listview_shopping);
mListView.setAdapter(mAdapter);
根据您的评论,这将影响适配器的性能:

如果您使用的是
recycle()视图
practice,这不会对性能产生太大影响

因此,在
getView()函数中:
而不是:

View rootView = LayoutInflater.from(context)
  .inflate(R.layout.banana_phone, parent, false);
如果您使用:

if (convertView == null) {
    convertView = LayoutInflater.from(context)
      .inflate(R.layout.banana_phone, parent, false);
}
ListView
回收不再显示的视图,并通过
convertView


有关更多详细信息,请阅读

,您需要创建两个ArrayList

因此,当您使用排序算法时,您正在创建第二个ArrayList,而不是覆盖原始ArrayList

ArrayList列表1和ArrayList列表2

将列表1的值复制到列表2中

然后对列表2执行任何排序

根据用户选择的是排序列表还是原始列表,使用所选列表设置适配器。这意味着您可以更改适配器中的列表,然后在每次选择不同的排序时进行设置

如果您关心每次设置适配器。您可以在中看到另一种方法来对适配器的项进行排序,而不使用此方法,它来自于
我不确定这是否是一种更具成本效益的方式来实现你想要实现的目标。这一选择最终是你的。

我希望用户可以随时对其进行排序/甚至在编辑后随时对其进行排序,如果我想在返回视图之前对其进行一次排序,此解决方案将有效,并且每次对列表进行排序时我都可以应用您的解决方案,但这不是一个好主意,我的问题是为什么它首先会引起问题?这个解决方案肯定会有效,除非你的案例是任何一种特殊的案例。如果你不懂我的英语,这不是我的母语,不管怎样,你的解决方案是有效的,我可以用你的代码替换adapter.notifydatasetchanged,这基本上意味着每次我对列表排序时都要设置适配器,问题是它可能没有那么快,这不是一个好主意,特别是在我的情况下,我正在覆盖adapter.notifydatasetchanged,以便我可以更新列表并保持其排序,因此每次排序时我都需要设置适配器!这不好。您误解了适配器的概念。我已
更新了
答案
,并作了进一步解释。另外,别忘了,如果答案很好/解决了你的问题,你应该投票
,作为
正确答案,谢谢你的帮助,我在这个网站上读到它不会那么快,我仍然试图找出为什么我使用adapter.notifydatasetchanged时它不起作用,再次感谢。@user3956566,问题是我想让它保持排序/让用户在运行时以他喜欢的方式选择排序顺序,menaing我不知道用户的选择是什么,他可能想根据价格、名称或任何东西对它进行排序,我只是有点困惑为什么它一开始就不起作用!除非我再次设置适配器@user3956566,问题不在于排序,我处理了所有问题,问题在于排序后我需要更新listview,以便用户可以看到新排序的列表,如果我使用adapter.notifydatasetchanged,它会对列表进行一些更改,并替换对象的内容,以给出错误的结果,如我提供的示例所示,第二种解决方案是每次我排序时设置适配器,有人说这不是一个好主意,我确实覆盖了adapter.notifydatasetchanged,结果列表排序正常,直到我调用super方法,然后它会把一切都搞糟。谢谢你的回答,但我认为如果我使用你的解决方案,速度会慢得多“如果我理解正确”问题不在于返回原始列表,问题在于更新后或具体调用“adapter.notifydatasetchanged”“它把列表搞得一团糟,第一个元素会覆盖最后一个元素,就像我给出的示例一样,它会继续这样做,这不是排序的问题,再次感谢,我想我会在每次排序时设置适配器,直到我弄明白这一点。