【问题标题】:Is is possible to permanently identify item in recyclerview? findviewwithtag sometimes returns null是否可以在 recyclerview 中永久识别项目? findviewwithtag 有时会返回 null
【发布时间】:2021-03-20 02:27:25
【问题描述】:

如果 .settag() 在 RecyclerViewAdapter 中设置,我不明白它是如何工作的。这是我的代码:

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {

    try {
        JSONObject _temp_json_object = new JSONObject( String.valueOf( mData.get( position ) ) );
    
        holder.tv_rssi.setText( _temp_json_object.getJSONObject( "Wifi" ).getString( "RSSI" ));
    
        final String _topic = _temp_json_object.getString("Topic");
    
        holder.tv_topic.setTag( _topic );
        holder.tv_topic.setText( _topic );
        }
    ...

稍后尝试使用 findViewWithTag 访问此标记时,有时它会返回正确的 TextView id,但有时会返回 null 并且我的代码会失败。有时意味着,我完全不知道触发器是什么,但通常会在应用程序进入后台并恢复时发生,然后 findviewwithtag 返回 null。

if (RecyclerView.findViewWithTag( _received_topic ) != null) {

    _arrayList.set( _new_obj );
    _adapter_rv.notifyItemChanged(id); //previously calculated id in json array position

}

我在不同的帖子中发现in this forum

通过视图回收机制,视图将被重用,.settag() 信息丢失。

因为我的目标是使用实时数据更新项目,所以我需要保留有关每个项目的持久信息,以便在在线数据到达时知道要更新什么。

知道如何实现这一目标吗?如果有更好的方法然后使用 .settag() 请告诉我。还在学习:-)

顺便说一句,我在 GridView 中使用完全相同的方法标记项目,并且 .settag() 是持久的,问题仅与 RecyclerView 有关

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    findViewWithTag() 有问题,而适配器有稳定的 ID。而且由于您没有透露为什么您甚至尝试访问这些项目,我只能说访问视图是无用的,因为通过适配器可以处理几乎所有事情。

    【讨论】:

    • 我希望我确实披露了。有来自 MQTT 代理到应用程序的实时日期。捕获 MQTT JSON 格式的消息,使用 .put 方法将它们放入 JSONArray。稍后 JSONArray 被传播到调用 notifyDataSetChanged() 或 notifyItemChanged() 的 RecyclerView 适配器。这取决于我们创建新的 JSONObject 或更新现有的。所以我需要确切地知道我需要向哪个项目写入更新的 JSON 数据。
    • Martin 的意思是你应该在你的适配器中循环你的mData 来查找是否存在任何东西,而不是使用findViewWithTag
    • 根本不需要接触视图,因此findViewWithTag() 无关紧要...消息只需要一些唯一标识符,适配器需要setHasStableIds(true)。这是一条相当单向的道路,这就是为什么数据操作应该发生在适配器中的原因; RecyclerView 只不过是表示层(视口之外的项目甚至没有附加) - 另一方面,适配器知道这一切。
    • 非常感谢您指向setHasStableIds(true) 我会检查我的代码
    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多