让我们说我有网上请求的膳食列表并使用Recyclerview实现,现在如果我想在顶部排序/移动特定项目怎么办...!
用餐: 意大利面食 |键入: 意大利面 |价格: 20 $
用餐: Hotdogs Pizza |输入: 披萨 |价格: 10 $
用餐: 汉堡 |输入: 快餐 |价格: 30美元
用餐: 大米 |输入: 午餐 |价格: 18 $
用餐: Mac&奶酪 |输入: 午餐 |价格: 17 $
用餐: CheeseBurger |输入: 快餐 |价格: 8 $
例如,我想要的是每个项目fast food
和pizza
显示在列表顶部,然后是其他项目。!?
我在哪里执行此排序逻辑,是在适配器内部还是在recyclelerview的活动中?有像这样的函数的现有方法,像moveToTop()
这样使用:
for(Meals item: dataList){
if (item.getType.equals("fast food") || item.getType.equals("pizza")){
item.moveToTop();
}
}
有可能吗?
我发现,在这些情况下,我发现了一个方法,它是recyclelerview的一个特殊的接口参数SortedListAdapterCallback
if (homeData.size() > 0) {
Collections.sort(homeData, Collections.reverseOrder(new SortedListAdapterCallback<HomeItemModel>(adapter) {
@Override
public int compare(HomeItemModel o1, HomeItemModel o2) {
int weight1;
int weight2;
if(item1.getType.equals("fast food") || item1.getType.equals("pizza")){
weight1 = 1;
}else{
weight1 = 0;
}
if(item2.getType.equals("fast food") || item2.getType.equals("pizza")){
weight2 = 1;
}else{
weight2 = 0;
}
if (weight1 == weight2)
return 0;
else if (weight1 > weight2)
return 1;
else
return -1;
}
@Override
public boolean areContentsTheSame(HomeItemModel oldItem, HomeItemModel newItem) {
return false;
}
@Override
public boolean areItemsTheSame(HomeItemModel item1, HomeItemModel item2) {
return false;
}
}));
}
这里唯一的问题是顶部的订单..!他们这样表现出来:
我希望他们展示有序......就像这样:
可以这样做吗??
答案 0 :(得分:2)
在POJO课程中创建比较器用餐
public static class CustomComparator implements Comparator<Meals> {
public int compare(Meals item1, Meals item2) {
int weight1;
int weight2;
if(item1.getType.equals("fast food") || item1.getType.equals("pizza")){
weight1 = 1;
}else{
weight1 = 0;
}
if(item2.getType.equals("fast food") || item2.getType.equals("pizza")){
weight2 = 1;
}else{
weight2 = 0;
}
if (weight1 == weight2)
return 0;
else if (weight1 > weight2)
return 1;
else
return -1;
}
}
在设置适配器之前调用此行,然后将数据列表传递给Adapter构造函数。
Collections.sort(yourDataLIst, Collections.reverseOrder(new Meals.CustomComparator()));
修改强> 如果你想要所有的快餐,然后比萨饼,然后所有的清单 然后只需调整您的排序逻辑,如下所示
if(item1.getType.equals("fast food")){
weight1 = 2;
}else if (item1.getType.equals("pizza")){
weight1 = 1;
} else {
weight1 = 0;
}
if(item2.getType.equals("fast food")){
weight2 = 2;
}else if (item2.getType.equals("pizza")){
weight2 = 1;
} else{
weight2 = 0;
}
答案 1 :(得分:0)
Arraylist 中没有类似moveToTop()
的简单方法。但您可以手动移动数据。
你可以这样做:
for(Meals item: dataList){
if (item.getType.equals("fast food") || item.getType.equals("pizza")){
int index = dataList.indexOf(item);
dataList.remove(index);
dataList.add(0, item);
adapter.notifyDataSetChanged()
}
}
希望有所帮助:)