8

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

假设 中有 7 项RecyclerView具有长值:1112212321-988118870-880093398-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我想根据上面给出的逻辑根据存储在每张卡中的这些值过滤数据。

请帮助我解决这个问题,并提出一些我可以实现这一目标的算法或代码。

4

5 回答 5

6

根据给出的信息量,我只能假设l是一个外部选择器值,它控制要在RecyclerView. 如果不是这种情况,请在下面评论,我将尝试纠正我的答案。

我建议实现一个 custom ,使用相应ViewAdapter的方法发送项目列表和选择器变量:l

public class ItemsAdapter extends 
    RecyclerView.Adapter<ItemsAdapter.ItemViewHolder> {

    private List<Long> mItemList;
    private List<Long> mDisplayItems;
    private boolean mAboveThousand = true;

    public void setItemList(List<Long> list) {
        mItemList = list;
        updateDisplayItems();
    }

    public void setSelectionType(boolean aboveThousand) {
        mAboveThousand = aboveThousand;
        updateDisplayItems();
    }

    private updateDisplayItems() {
        mDisplayItems.clear();

        for(Long item: mItemList) {
            if(/*check your contition*/) {
                mDisplayItems.add(item);
            }
        }

        notifyDataSetChanged(); //important
    }

    ...
    // Rest of implementation
}

另外,我从来没有使用过 FastAdapter,但我想如果你扩展它的类,肯定有一些方法可以覆盖。

更新

由于您在理解使用 a 的基础知识时遇到了问题ViewAdapter,因此我建议您ViewAdapter在使用任何库之前学习和实现自定义。是一个关于如何实现ViewAdapterRecyclerView 的详尽教程。

现在,在实现 ViewAdapter 之后,您可以使用我的代码来过滤掉卡片。基本上,代码所做的是将所有所需数据的列表保存在其中mItemList,而mDisplayList将要显示的项目存储在列表中,该列表每次更新mAboveThousand,其中存储了用户偏好设置在 1000 以上或以下。现在mDisplayList必须使用它来膨胀 RecyclerView 中的数据。

于 2017-01-01T09:13:09.803 回答
4

如果您确实想继续使用 FastAdapter,它有一个内置的过滤器功能(参见项目 README 中的第5 点。请注意,该filter方法应该在之后 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从我认为您想使用外部llong 指标根据它们的 long 值过滤项目时开始:

在您的代码中,假设您的应用程序确实到达了if您在问题中提到的应该何时 - 删除fastItemAdapter.clear();and 而不是内部写入的for循环if

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

在此之前的某个地方,最好在您设置适配器的位置(最有可能在onCreateof 中MainActivity)添加以下内容:

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您提到的时间应该确定是否)

于 2017-01-03T08:54:19.557 回答
4

即使是您非常基本的代码也可以使用。您可以计算该范围内的项目数并返回该范围内的数字。我建议您尝试在没有 FastAdapter 的情况下执行此操作,因为基于过滤器值解析数据的核心概念非常可靠。您可以迭代循环并计算它们,您可以迭代循环并返回第 n 个项目。

于 2017-01-01T09:54:32.203 回答
3

我猜你的课就像

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();
}
于 2017-01-06T15:17:34.233 回答
0

您可以在从 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);
于 2017-01-07T21:26:16.857 回答