如何在顶部显示特定的 recyclerview 项目?
How do show specific recyclerview items at the top?
假设我有一个关于膳食列表的网络请求并使用 Recyclerview 实现,现在如果我想 sort/move 顶部的特定项目怎么办......!
餐点:意大利面|类型: 意大利面 |价格:20$
餐点:热狗披萨|类型: 披萨 |价格:10元
餐点:汉堡|类型: 快餐 |价格:30$
餐点:饭|输入: 午餐 |价格:18元
餐食:Mac&奶酪|输入: 午餐 |价格:17$
餐点:芝士汉堡|类型: 快餐 |价格:8元
例如,我想要的是每个类型为 fast food
和 pizza
的项目显示在列表的顶部,然后是其余的..!?
我在哪里执行这个排序逻辑,它是在适配器内部还是在 recyclerview 的 activity 中?是否有像 moveToTop()
这样的函数的现有方法可以像这样使用:
for(Meals item: dataList){
if (item.getType.equals("fast food") || item.getType.equals("pizza")){
item.moveToTop();
}
}
可能吗?
更新 2
我想通了,我在这些情况下找到了一个方法,一个用于recyclerview的接口的特殊参数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;
}
}));
}
这里唯一的问题是顶部的顺序..!他们这样显示:
- 快餐
- 披萨
- 披萨
- 快餐
- 披萨
- 快餐
- ...列表的其余部分
我希望它们显示有序.. 像这样:
- 快餐 // 或先吃披萨
- 快餐
- 快餐
- 披萨
- 披萨
- 披萨
- ...列表的其余部分
这能做到吗..?
在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()
}
}
希望对您有所帮助:)
在您的 POJO 中创建一个比较器 class 膳食
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;
}
}
在设置您的适配器之前调用此行,然后将数据列表传递到您的适配器构造函数中。
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;
}
假设我有一个关于膳食列表的网络请求并使用 Recyclerview 实现,现在如果我想 sort/move 顶部的特定项目怎么办......!
餐点:意大利面|类型: 意大利面 |价格:20$
餐点:热狗披萨|类型: 披萨 |价格:10元
餐点:汉堡|类型: 快餐 |价格:30$
餐点:饭|输入: 午餐 |价格:18元
餐食:Mac&奶酪|输入: 午餐 |价格:17$
餐点:芝士汉堡|类型: 快餐 |价格:8元
例如,我想要的是每个类型为 fast food
和 pizza
的项目显示在列表的顶部,然后是其余的..!?
我在哪里执行这个排序逻辑,它是在适配器内部还是在 recyclerview 的 activity 中?是否有像 moveToTop()
这样的函数的现有方法可以像这样使用:
for(Meals item: dataList){
if (item.getType.equals("fast food") || item.getType.equals("pizza")){
item.moveToTop();
}
}
可能吗?
更新 2
我想通了,我在这些情况下找到了一个方法,一个用于recyclerview的接口的特殊参数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;
}
}));
}
这里唯一的问题是顶部的顺序..!他们这样显示:
- 快餐
- 披萨
- 披萨
- 快餐
- 披萨
- 快餐
- ...列表的其余部分
我希望它们显示有序.. 像这样:
- 快餐 // 或先吃披萨
- 快餐
- 快餐
- 披萨
- 披萨
- 披萨
- ...列表的其余部分
这能做到吗..?
在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()
}
}
希望对您有所帮助:)
在您的 POJO 中创建一个比较器 class 膳食
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;
}
}
在设置您的适配器之前调用此行,然后将数据列表传递到您的适配器构造函数中。
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;
}