Java 如何在顶部显示特定的recyclerview项目?
假设我有一个关于膳食列表的web请求,并使用Recyclerview实现,现在如果我想对顶部的特定项目进行排序/移动,该怎么办Java 如何在顶部显示特定的recyclerview项目?,java,android,arrays,android-recyclerview,adapter,Java,Android,Arrays,Android Recyclerview,Adapter,假设我有一个关于膳食列表的web请求,并使用Recyclerview实现,现在如果我想对顶部的特定项目进行排序/移动,该怎么办 膳食:意大利面食|类型:意大利面食|价格:20$ 餐:热狗披萨|类型:披萨|价格:10$ 餐:汉堡|类型:快餐|价格:30$ 膳食:米饭|类型:午餐|价格:18$ 膳食:Mac&Cheese|类型:午餐|价格:17$ 餐:奶酪汉堡|类型:快餐|价格:8$ 例如,我想要的是,每一种有快餐和比萨饼的物品都显示在列表的顶部,然后是其他物品 我在哪里执行这个排序逻辑,它是在
膳食:意大利面食|类型:意大利面食|价格:20$ 餐:热狗披萨|类型:披萨|价格:10$ 餐:汉堡|类型:快餐|价格:30$ 膳食:米饭|类型:午餐|价格:18$ 膳食:Mac&Cheese|类型:午餐|价格:17$ 餐:奶酪汉堡|类型:快餐|价格:8$
例如,我想要的是,每一种有
快餐
和比萨饼
的物品都显示在列表的顶部,然后是其他物品
我在哪里执行这个排序逻辑,它是在适配器内部还是在recyclerview的活动中?此函数是否有类似于moveToTop()
的现有方法可以这样使用:
for(Meals item: dataList){
if (item.getType.equals("fast food") || item.getType.equals("pizza")){
item.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()
}
}
可能吗
更新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;
}
}));
}
if(homeData.size()>0){
Collections.sort(家庭数据、集合.reverseOrder)(新的SortedListAdapterCallback(适配器){
@凌驾
公共整数比较(HomeItemModel o1、HomeItemModel o2){
int权重1;
int权重2;
if(item1.getType.equals(“快餐”)| | item1.getType.equals(“比萨饼”)){
权重1=1;
}否则{
权重1=0;
}
if(item2.getType.equals(“快餐”)| | item2.getType.equals(“比萨饼”)){
权重2=1;
}否则{
权重2=0;
}
如果(权重1==权重2)
返回0;
否则如果(权重1>权重2)
返回1;
其他的
返回-1;
}
@凌驾
公共布尔值是相同的内容(HomeItemModel oldItem、HomeItemModel newItem){
返回false;
}
@凌驾
公共布尔项相同(HomeItemModel项1、HomeItemModel项2){
返回false;
}
}));
}
这里唯一的问题是,顶部的订单。。!它们表现为:
for(Meals item: dataList){
if (item.getType.equals("fast food") || item.getType.equals("pizza")){
item.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()
}
}
- 快餐
- 披萨
- 披萨
- 快餐
- 披萨
- 快餐
- 。。。名单的其余部分
- 快餐//还是先吃比萨饼
- 快餐
- 快餐
- 披萨
- 披萨
- 披萨
- 。。。名单的其余部分
这可以做到吗?在Arraylist中没有像
moveToTop()
这样简单的方法。但是您可以手动移动数据
您可以这样做:
for(Meals item: dataList){
if (item.getType.equals("fast food") || item.getType.equals("pizza")){
item.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()
}
}
希望有帮助:)在Arraylist中没有像
moveToTop()
这样简单的方法。但是您可以手动移动数据
您可以这样做:
for(Meals item: dataList){
if (item.getType.equals("fast food") || item.getType.equals("pizza")){
item.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课程中创建一个比较器
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;
}
}
编辑
如果你想先吃所有的快餐,然后吃比萨饼,然后是所有的清单
然后调整排序逻辑,如下所示
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;
}
在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;
}
}
编辑
如果你想先吃所有的快餐,然后吃比萨饼,然后是所有的清单
然后调整排序逻辑,如下所示
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;
}
你必须对你的名单进行排序。你决定怎么做取决于你看看这个答案:虽然它不是特定于android的,但它可能会帮助你对你的列表进行排序。你决定怎么做取决于你看看这个答案:虽然它不是特定于android的,但它可能会帮助你不工作,但列表没有排序?你确定这个逻辑吗?列表不必排序<代码>排序函数将根据比较器逻辑对它们进行排序。你可以自己检查逻辑是否需要这样的东西?我解决了,批准编辑。。你能帮我解决这个小问题吗。。!把你问题的最后一部分发出来,在例子中我有个问题。。膳食类型是手动设置的,但在我的真实代码中,它们不是。首先,这是兴趣爱好而不是膳食类型,用户可以在应用程序启动后从一个列表中进行选择,在下一个屏幕中,选定的兴趣爱好将显示在数据列表的顶部,然后是其他。。!我尝试了一些soulton,但都不起作用,这里的要点中的一个,它只显示嗜好列表中的第一项,而忽略了选择的另一项。!?请帮我做这个。。不起作用,列表没有排序?你确定这个逻辑吗?列表不必排序<代码>排序函数将根据比较器逻辑对它们进行排序。你可以自己检查逻辑是否需要这样的东西?我解决了,批准编辑。。你能帮我解决这个小问题吗。。!把你问题的最后一部分发出来,在例子中我有个问题。。膳食类型是手动设置的,但在我的真实代码中,它们不是。首先,这是兴趣爱好而不是膳食类型,用户可以在应用程序启动后从一个列表中进行选择,在下一个屏幕中,选定的兴趣爱好将显示在数据列表的顶部,然后是其他。。!我尝试了一些soulton,但都不起作用,这里的要点中的一个,它只显示嗜好列表中的第一项,而忽略了选择的另一项。!?请帮我做这个。。没用,我说了