【问题标题】:Updating RecyclerView with ArrayList inside and between fragments在片段内部和片段之间使用 ArrayList 更新 RecyclerView
【发布时间】:2020-11-07 20:34:21
【问题描述】:

我有MainActivity.class 和两个Fragments 都有RecyclerView。从 Fragment A,我使用 fragmentTransaction.add(R.id.fragment_container1, fragment_b); 转到 Fragment B -->(简而言之,来自 Sqldatabase 的数据放入 ArrayList
现在在片段B中,当我更改single RecyclerView Card 中的一些数据时,我正在使用onActivityResult 更新RecyclerView,如下所示:


 @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == SECOND2_LAUNCH){
            if(resultCode == Activity.RESULT_OK){               
                  int modify_position = data.getIntExtra("key4", DEFAULT:0);
                  MyItem item = data.getParcelableExtra("key3");
                  data_list7.set(modify_position,item);
                  mAdapter_details.notifyItemChanged(modify_position);
                }
            }
            if (resultCode == Activity.RESULT_CANCELED){
                Toast.makeText(getContext(),"error", Toast.LENGTH_SHORT).show();
            }
        }
}

例如,我想更改位置 135 的项目名称而不重新加载所有数据,例如:adapter.notifydatasetchanged(); 我更喜欢使用adapter.notifyItemChanged(int position)
片段B具有动态加载的Recyclerview,当片段B中的RecyclerView加载所有数据时,它会刷新整个Arraylist,所以数据我之前更改过(Recyclerview 加载所有)不刷新仅上次调用data_list7.set(modify_position,item); 有效,较早更改的项目未显示或返回到之前的状态(在 RecyclerView 加载所有数据并刷新 Arraylist 之后)为什么?
第二个问题是“更重”,因为我在RecyclerviewFragmnet B 中更改了数据,当按下返回按钮时,我必须在 Fragmnet B 中显示,我返回到 Fragment A 然后我也必须更新这些数据......(无需重新加载所有数据)。 另外麻烦的是 Fragment A 使用不同的RecyclerView Adapter 所以我必须发送数据,然后用 Fragment A 中的onResumeonStart 方法刷新它,但如何做到这一点。 我想到了这些解决方案:关于第二个问题。
1.通过 Parcelable 发送数据
2.通过 Intent 发送数据
3.在RecyclerView_Adapter.class实现我自己的接口
4.也许RecyclerViewRecyclerView_Adapter中有一些现成的方法(Android内置)
5.也许我应该对onBindViewHolder 进行一些更改,从那里刷新我的项目...
如果关于第一个问题:
代码:

if(resultCode == Activity.RESULT_OK){               
                  int modify_position = data.getIntExtra("key4", DEFAULT:0);
                  MyItem item = data.getParcelableExtra("key3");
                  data_list7.set(modify_position,item);
                  mAdapter_details.notifyItemChanged(modify_position);
                }

我应该放入 Array 或使用 while/for 循环
我需要多次使用这个:

data_list7.set(modify_position,item);               
mAdapter_details.notifyItemChanged(modify_position);

就这些了,先谢谢了。

【问题讨论】:

  • 首先要重新加载Fragment A,可以将transaction.add改为transaction.replace
  • 是的,我知道,“添加”是我有意识的。

标签: android android-fragments arraylist android-recyclerview data-transfer


【解决方案1】:

解决方案1.您可以将数据存储在Room数据库中,并通过UI上的LiveData<List<MyItem>>观察它并更新适配器。

解决方案 2. 您可以在两个 Fragment 之间共享 ViewModel 而无需存储在数据库中

解决方案3.通过new Result API在片段之间传递数据

【讨论】:

  • 我选择 3 号解决方案,因为对于我的第一个项目,它更容易,但我现在有 2 个问题。数组的第一个问题。将数据从 Fragment B 传递到 Fragment A。我有相同的光标位置,但在数组中的位置不同(例如在 Fragment B 中编辑的位置是 2,在 Fragment A 中这个数据在位置 4,所以如何更新 Frag A 中的 ArrayList ?第二件事是如何多次调用它?我不能将它分配给变量,因为我不知道用户将编辑多少次(我的意思是 RecyclerView 卡)。我想我必须使用带有迭代的 while 循环对吗?
  • 我认为对于这种情况,将数据存储在数据库中是首选方式。您可以从任何地方获取更新的记录。如果数据是临时的,您可以在内存数据库中创建
  • 我可以问你一个例子吗?我无法想象该怎么做。
  • 这里是关于房间数据库:medium.com/mindorks/…
  • 我对房间数据库一无所知。我已经制作了一个教程,但我不知道如何处理我的:Some_class extends SQLiteOpenHelper 在这堂课中我用列制作了表格,所以这堂课必须留下,对吗?现在。当我制作示例性项目时,它在 RecyclerView 中完美显示,但是当我使用数据库浏览程序(例如 Firefox 有一些扩展名)时,它显示我之前没有任何列我拥有所有数据库结构(列名和类型等)所以我的问题是应该是这样的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
相关资源
最近更新 更多