Android 是否可以在recyclerview中永久标识项目?findviewwithtag有时返回null

Android 是否可以在recyclerview中永久标识项目?findviewwithtag有时返回null,android,android-recyclerview,Android,Android Recyclerview,如果在RecycleServiceAdapter中设置了.settag(),我不明白它是如何工作的。这是我的代码: @Override public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { try { JSONObject _temp_json_object = new JSONObject( String.valueOf( mData.get( position )

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

@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

}
我在不同的岗位上发现

通过视图循环机制,视图将被重用,并且.settag()信息将丢失

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

你知道如何做到这一点吗?如果有比使用.settag()更好的方法,请告诉我。仍在学习:-)


顺便说一句,我在GridView中使用了完全相同的标记项的方法,并且.settag()是持久的,问题只与RecyclerView有关。当适配器具有稳定的ID时,findViewWithTag()是有问题的。而且由于您没有透露您甚至尝试访问这些项的原因,我只能说访问视图是无用的,因为人们可以通过适配器处理几乎所有的事情。

我希望我做到了。从MQTT代理到应用程序有实时日期。捕获MQTT JSON格式的消息,使用.put方法将它们放入JSONArray。稍后,JSONArray将传播到调用notifyDataSetChanged()或notifyItemChanged()的RecyclerView适配器。这取决于我们创建新的JSONObject或更新现有的JSONObject。因此,我需要确切地知道我需要将更新的JSON数据写入哪个项目。Martin说的是,您应该在适配器中循环使用
mData
,以查找是否存在任何内容,而不是使用
findViewWithTag
一点也不需要触摸视图,因此
findViewWithTag()
与此无关。。。消息只需要一些唯一标识符,适配器需要
setHasStableIds(true)
。这是一条相当单向的道路,这就是为什么数据操作应该在适配器中发生
RecyclerView
只不过是表示层(甚至视口外的项目都没有附加)-另一方面,适配器知道这一切。非常感谢您指向
SetHassTableId(true)
我将查看我的代码