java - setselectionfromtop - scrolltopositionwithoffset




无法编写用于根据每个项目保存的长时间筛选出RecyclerView中的项目的算法 (4)

我在RecyclerView有几个项目,每个项目都有一个long值保存。 我正在使用FastAdapter作为我的RecyclerView的适配器。

假设RecyclerView有7个项目的值很长,分别为: -98811-88009-22113-22113

所以, 我想要做的是,我想要使用这个逻辑基于上述给定的长值过滤项目:

if (l <= 1000) {
  // show items with long value <=1000
} else if (l > 1000) {
  // show items with long value >1000
}

我尝试了各种各样的东西,但没有解决。

更新1 :这里的项目是存储在CardView中的一种不同的数据,然后在RecyclerView 。 每张卡包含不同的数据,其中之一是以上给定的long值。 我想根据上面给出的逻辑基于存储在每个卡中的这些long值来过滤数据。

请帮我解决这个问题,并提出一些算法或代码,我可以做到这一点。


即使你的基本代码也可以工作。 您可以计算该范围内的项目数量并返回该范围内的数字。 我建议你不用FastAdapter来做这个,因为基于过滤器值解析数据的核心概念是完全可靠的。 您可以迭代循环并对它们进行计数,并且可以迭代循环并返回第n个项目。


如果你想继续使用FastAdapter,它有一个内置的过滤器功能(参见项目README中的第5点注意filter方法应该 withFilterPredicate 之后 withFilterPredicate而不是之前的那样)。

编辑 - 之后你指出我误解了你之前 - 这里是我更新的建议说明:

您需要解析您想要显示哪些设置的逻辑(使用您在注释中提到的对话框中的复选框),并将该信息传递到过滤器上,例如:

boolean displayUnderThreshold = //put the logic here - true if you want <1000
fastAdapter.filter(Boolean.toString(displayUnderThreshold));

在设置适配器的位置(在调用上面的行之前)有:

final long threshold = 1000;
fastAdapter.withFilterPredicate(new IItemAdapter.Predicate<GRModeClass>() {
    @Override
    public boolean filter(GRModeClass item, CharSequence constraint) {
        boolean displayUnderThreshold = new Boolean(constraint.toString());
        return (displayUnderThreshold ^ (item.l<threshold)); //false to remove from list
    }
});

老答案

从我以为你想过滤项目根据他们的ms长的价值,使用外部l长指标:

在你的代码中,假设你的应用程序确实去了, if你在问题中提到的时候应该 - 删除fastItemAdapter.clear(); 而不是写if里面的for循环

fastItemAdapter.filter(Long.toString(l));

以及之前的某个地方,最好在设置适配器的位置(很可能在MainActivityonCreate中)添加以下内容:

final long threshold = 1000;
fastAdapter.withFilterPredicate(new IItemAdapter.Predicate<GRModeClass>() {
    @Override
    public boolean filter(GRModeClass item, CharSequence constraint) {
        long indicator = new Long(constraint.toString());
        return (item.ms<threshold && indicator>=threshold) || (item.ms>=threshold && indicator<threshold) ;
    }
});

(假设在这里, GRModeClass是你的项目类,而long ms是你提到的那个长度,应该决定是否)


我猜你的班是这样的

public Class ListItem {
    // .. Some other attributes
    public long l;
}

现在,我希望你有一些函数,当你在你的RecyclerView放置一个过滤器。 让函数名称为toggleFilter

public void toggleFilter(long l) {
    if(l <= 1000) {
        fastAdapter.withFilterPredicate(new IItemAdapter.Predicate<Item>() {
            @Override
            public boolean filter(ListItem item, CharSequence constraint) {
                if(item.l <= 1000) return true;
                else return false; 
            }
        });

    } else if (l > 1000) {
        fastAdapter.withFilterPredicate(new IItemAdapter.Predicate<Item>() {
            @Override
            public boolean filter(ListItem item, CharSequence constraint) {
                if(item.l > 1000) return true;
                else return false; 
            }
        });
    }

    // Finally call notifyDataSetChanged        
    fastAdapter.notifyDataSetChanged();
}

您可以从Firebase进行过滤时进行过滤。

l <= 1000

firebaseDatabase.child(key).orderByChild("long_value_key_in_firebase").endAt(1000);

l> 1000

firebaseDatabase.child(key).orderByChild("long_value_key_in_firebase").startAt(1000);




fastadapter