根据距离添加和删除recyclerview的项目

时间:2018-07-18 13:41:10

标签: java android arraylist android-recyclerview

我正在开发一个应用程序,其中消息列表(MESSAGE_RECIEVED)仅在一定距离(50、100、200、300或400米)内可见。

为此,我有一个消息的ArrayList(MESSAGE_RECIEVED),一个带有自定义适配器的RecyclerView和一个包含RecyclerView的片段,并给它我的ArrayList。

我现在使用的方法如下:

要删除条目(在我的适配器中):

public void removeAt(int pos) {
    mMessagesList.remove(pos);
    notifyItemRemoved(pos);
    notifyItemRangeChanged(pos, mMessagesList.size());
}

要添加一个条目(在我的适配器中):

public void addAt(int pos, Message m){
    mMessagesList.add(pos, m);
    notifyItemInserted(pos);
}

最后,我的代码确定一个物品是否太远:

ArrayList<String[]> operation = new ArrayList<>();


for (int i = 0; i < MESSAGES_RECEIVED.size(); i++){

    if(dist <= distMax){
        if(!MESSAGES_RECEIVED.get(i).isDisplayed()){
            operation.add(new String[]{"add", String.valueOf(i)});
            MESSAGES_RECEIVED.get(i).setDisplayed(true);
        }
    } else {
        operation.add(new String[]{"remove", String.valueOf(i)});
    }

}

for (String[] values : operation){
    Log.i(TAG, "recalculateDistance: " + values[0] + " " + values[1]);
    if(values[0].equals("add")){
        int pos = Integer.valueOf(values[1]);
        mRecyclerViewAdapter.addAt(pos, MESSAGES_RECEIVED.get(pos));
    } else if(values[0].equals("remove")){
        int pos = Integer.valueOf(values[1]);
        mRecyclerViewAdapter.removeAt(pos);
    }
}

由于从我的消息ArrayList中删除了项目,因此此代码不起作用。我无法删除它们,因为它们已在其他地方使用(并且我有IndexOutOfBoundsException,因为该位置不在ArrayList的范围内)。 最重要的是,我无法删除它们,因为如果它们在定义的范围内,人们将无法看到它们。

是否有一种隐藏项目而不删除它们的方法?我虽然复制了邮件列表,但不知道这样是否可行。

预先感谢大家!

1 个答案:

答案 0 :(得分:0)

好吧,我终于找到了使它起作用的东西。我创建了另一个ArrayList并将其放置在静态类中(以便我可以从应用程序中的多个位置更新显示)

这是我创建的方法

公共静态无效值updateDisplayedMessages(){         MESSAGES_DISPLAYED.clear();

    getDistance(MESSAGES_RECEIVED);
    for(Message m : MESSAGES_RECEIVED){

        float dist = m.getDistance();
        int distMax = Integer.valueOf(VALUE_PREF_RADIUS_GEO_FENCING);

        if(dist < distMax){
            MESSAGES_DISPLAYED.add(m);
        }
    }

}

这就是所谓的,我从片段中调用notifyDataSetChanged就是这样!可能不是实现它的最有效方法,但它可行