Android 使用适配器按升序对ListView元素排序

Android 使用适配器按升序对ListView元素排序,android,sorting,listview,Android,Sorting,Listview,在我的应用程序中,我的目标是让用户从他们的图库上传图像,并将其保存到数据库中。每个图像都有一个名称,该名称和图像将显示在listview中。列表视图的排序方式类似于手机中的联系人。它们实际上是房产地图,例如不同的酒店或度假村,甚至是学校,用于交付。我所有的东西都按照我想要的方式工作,但由于某种原因,我很难把它们按字母顺序排列。我尝试过其他的例子和片段,但没有成功。我的代码如下: protected void onCreate(Bundle savedInstanceState) { su

在我的应用程序中,我的目标是让用户从他们的图库上传图像,并将其保存到数据库中。每个图像都有一个名称,该名称和图像将显示在listview中。列表视图的排序方式类似于手机中的联系人。它们实际上是房产地图,例如不同的酒店或度假村,甚至是学校,用于交付。我所有的东西都按照我想要的方式工作,但由于某种原因,我很难把它们按字母顺序排列。我尝试过其他的例子和片段,但没有成功。我的代码如下:

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.display_hotels);

    db = new DatabaseHandler(this);

    lv = (ListView) findViewById(R.id.list1);
    pic = (ImageView) findViewById(R.id.pic);
    fname = (EditText) findViewById(R.id.txt1);

    final ArrayList<Hotel> hotels = new ArrayList<>(db.getAllHotels());
    data = new dataAdapter(this, hotels);

    Collections.sort(hotels, new Comparator<Hotel>()
    {
        public int compare(Hotel a1, Hotel a2)
        {
            return (a1.toString()).compareTo(a2.toString());
        }
    });

    lv.setAdapter(data);
}
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(右布局显示);
db=新的DatabaseHandler(此);
lv=(ListView)findViewById(R.id.list1);
pic=(ImageView)findViewById(R.id.pic);
fname=(EditText)findViewById(R.id.txt1);
最终ArrayList hotels=新的ArrayList(db.getAllHotels());
数据=新的数据适配器(此为酒店);
Collections.sort(酒店、新比较器()
{
公共内部比较(a1酒店、a2酒店)
{
return(a1.toString()).compareTo(a2.toString());
}
});
lv.setAdapter(数据);
}
在我输入代码进行比较之前:

Collections.sort(hotels, new Comparator<Hotel>()
    {
        public int compare(Hotel a1, Hotel a2)
        {
            return (a1.toString()).compareTo(a2.toString());
        }
    });
Collections.sort(酒店、新比较器()
{
公共内部比较(a1酒店、a2酒店)
{
return(a1.toString()).compareTo(a2.toString());
}
});

它只是按照图像保存的顺序显示图像。但这段代码似乎有问题。我试着按顺序保存3张不同的房产图片:西门度假村、格兰德乡村酒店和奥扎克学院。出于某种原因,西门第一,奥扎克学院第二,格兰德乡村酒店第三。如果我加上同样的图片,并将其命名为Grand Country Inn,Westgate Resort将落在列表的底部。这似乎是正确的,但在添加另一个图像后,Westgate将返回顶部。任何帮助都将不胜感激!谢谢您的时间。

在调用<强>排序< /强>方法之后,尝试初始化适配器。< /P> < P>请考虑添加

data.notifyDataSetChanged()
每次向列表中添加元素时

您可以做的另一件事是在将每个元素添加到列表中之前将其小写。或者试试这个代码

Collections.sort(hotels, new Comparator<Hotel>(){
    public int compare(Hotel a1, Hotel a2)
    {
        return (a1.toString().toLowerCase()).compareTo(a2.toString().toLowerCase());
    }
}); 
Collections.sort(酒店、新比较器(){
公共内部比较(a1酒店、a2酒店)
{
返回(a1.toString().toLowerCase()).compareTo(a2.toString().toLowerCase());
}
}); 

我设法弄明白了。我没有使用Collections.sort()方法,而是在适配器上使用了sort()

data = new dataAdapter(this, hotels);

    data.sort(new Comparator<Hotel>()
    {
        @Override
        public int compare(Hotel arg0, Hotel arg1)
        {
            return arg0.getFName().compareTo(arg1.getFName());
        }
    });

    data.notifyDataSetChanged();
    lv.setAdapter(data);
data=newdataadapter(此为酒店);
data.sort(新的比较器()
{
@凌驾
公共整数比较(酒店arg0、酒店arg1)
{
返回arg0.getFName().compareTo(arg1.getFName());
}
});
data.notifyDataSetChanged();
lv.setAdapter(数据);

我不确定这是否是一种不好的做法,但出于我的需要,它工作得非常完美。

您正在尝试比较hotel对象的.toString()。相反,您应该在hotel对象中有一个属性,比如imagestring,并对它们进行比较以使其正确。类似于此,如果您没有重写提供此字符串的tostring函数,则在将其直接转换为string时遇到问题是正常的。我尝试了这个解决方案,但不幸的是没有成功。每次我点击我的显示按钮,输出是不同的。每个元素似乎每次都会在列表中上移,每次都会产生不同的输出;?这会导致应用程序在我单击按钮显示结果时崩溃。但不幸的是,在logcat中没有给出任何错误。