问题描述
我有MainActivity.class
,两个Fragments
都有RecyclerView
。从片段A ,我使用fragmentTransaction.add(R.id.fragment_container1,fragment_b);
->(进入片段B ,简而言之,将sqldatabase
中的数据放入ArrayList
中)
现在在片段B 中,当我在single RecyclerView Card
中更改某些数据时,我正在使用RecyclerView
来更新onActivityResult
,如下所示:
@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();
}
}
}
例如,我想更改位置 1 , 3 , 5 的项目名称,而无需重新加载所有数据,例如:adapter.notifydatasetchanged();
我更喜欢使用adapter.notifyItemChanged(int position)
。
当片段B 中的RecyclerView
加载了所有数据后,片段B 具有可动态加载的Recyclerview,它刷新了整个Arraylist
,因此我之前更改过的数据(Recyclerview全部加载)不刷新,仅最后一次调用data_list7.set(modify_position,item);
有效,较早更改的项未显示或返回到previos状态(在RecyclerView加载所有数据并刷新Arraylist之后)为什么?
第二个问题是,由于我在Recyclerview
的 Fragmnet B 中更改了数据,因此“较重”,当按下后退按钮时,我必须在 Fragment A 中显示,然后返回片段A ,然后我也必须更新此数据...(不重新加载所有数据)。
另外的麻烦是片段A 使用了不同的RecyclerView Adapter
因此,我必须发送数据,然后使用片段A 中的onResume
或onStart
方法进行刷新,但要怎么做。
这些解决方案浮现在脑海:关于第二个问题。
1 。通过以下方式发送数据:可打包
2 。通过Intent发送数据
3.在RecyclerView_Adapter.class
中实现我自己的界面
4.也许在RecyclerView
或RecyclerView_Adapter
中有一些现成的方法(内置于Android中)
5.也许我应该在onBindViewHolder
中进行一些更改,以刷新我的项目...
如果是第一个问题:
代码:
if(resultCode == Activity.RESULT_OK){
int modify_position = data.getIntExtra("key4",item);
mAdapter_details.notifyItemChanged(modify_position);
}
我应该放入 Array 或使用 while / for循环。
我需要多次使用:
data_list7.set(modify_position,item);
mAdapter_details.notifyItemChanged(modify_position);
那么,谢谢大家。
解决方法
解决方案1.您可以将数据存储在Room数据库中,并通过UI上的LiveData<List<MyItem>>
进行观察并更新适配器。
解决方案2。您可以在两个片段之间共享ViewModel,而无需存储在数据库中
解决方案3.通过new Result API
在片段之间传递数据