【问题标题】:Add and remove item of recyclerview depending on distance根据距离添加和删除recyclerview的项目
【发布时间】:2018-07-18 13:41:09
【问题描述】:

我正在开发一个应用程序,其中消息列表 (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 的范围)。 最重要的是,我无法删除它们,因为如果它们在定义的范围内,人们将无法看到它们。

有没有办法隐藏项目而不删除它们?我想复制我的消息列表,不知道这是否可行。

提前谢谢各位!

【问题讨论】:

    标签: java android arraylist android-recyclerview


    【解决方案1】:

    好的,我终于找到了使它起作用的东西。我创建了另一个 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,就是这样!可能不是最有效的实现方式,但它确实有效

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多