Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在片段内部和片段之间使用ArrayList更新RecyclerView_Android_Android Fragments_Arraylist_Android Recyclerview_Data Transfer - Fatal编程技术网

Android 在片段内部和片段之间使用ArrayList更新RecyclerView

Android 在片段内部和片段之间使用ArrayList更新RecyclerView,android,android-fragments,arraylist,android-recyclerview,data-transfer,Android,Android Fragments,Arraylist,Android Recyclerview,Data Transfer,我有MainActivity.class和两个片段都有RecyclerView。从片段A,我使用fragmentTransaction.add(R.id.Fragment\u container1,Fragment\u B)转到片段B-->(简而言之,数据从Sqldatabase放入ArrayList) 现在,在片段B中,当我更改单个RecyclerView卡中的一些数据时,我正在使用onActivityResult更新RecyclerView,如下所示: @Override pub

我有
MainActivity.class
和两个
片段
都有
RecyclerView
。从片段A,我使用
fragmentTransaction.add(R.id.Fragment\u container1,Fragment\u B)转到片段B
-->(简而言之,数据从
Sqldatabase
放入
ArrayList

现在,在片段B中,当我更改
单个RecyclerView卡中的一些数据时,我正在使用
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()我更喜欢使用
适配器。notifyItemChanged(int位置)

片段B具有动态加载的Recyclerview当片段B中的
Recyclerview
加载所有数据时,它会刷新整个
Arraylist
,因此我之前更改的数据(Recyclerview load all)不会仅刷新最后一次调用
数据列表7.set(修改位置,项目)工作,早期更改的项目不显示或返回到previos状态(在RecyclerView加载所有数据并刷新Arraylist后)为什么?
第二个问题是“较重”,因为我在
Recyclerview
中更改了Fragmnet B中的数据,我必须在片段A中显示,当按下“后退”按钮时,我返回到片段A,然后我也必须更新此数据。。。(不重新加载所有数据)。 另外一个问题是片段A使用不同的
RecyclerView适配器
因此,我必须发送数据,然后在片段A中的
onResume
onStart
方法中刷新数据,但如何做到这一点。 我想到了这些解决办法:关于第二个问题。
1。通过:Parcelable发送数据
2。通过意向发送数据
3.在
RecyclerView\u Adapter.class中实现我自己的接口
4.在
RecyclerView
RecyclerView\u适配器中可能有一些现成的方法(内置于Android中)

5.也许我应该在
onBindViewHolder
中做一些更改,然后刷新我的项目…
如果涉及第一个问题:
代码:

我应该放入数组或使用while/for循环
我需要多次使用此功能:

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

好了,谢谢。解决方案1。您可以将数据存储在房间数据库中,并通过UI上的
LiveData
观察数据,然后更新适配器

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


解决方案3。通过

在片段之间传递数据首先要重新加载片段A,您可以更改transaction.add到transaction.replace是的,我知道,“add”是由我意识到的。我选择解决方案3,因为这对于我的第一个项目来说要容易得多,但我现在有两个问题。数组的第一个问题。将数据从片段B传递到片段A。我的光标位置相同,但在数组中的位置不同(例如,在片段B中,编辑位置为2,在片段A中,该数据位于位置4,因此如何更新片段A中的ArrayList?第二件事是如何多次调用它?我无法将其分配给变量,因为我不知道有多少次(我指的是RecyclerView卡)用户将进行编辑。我想我必须使用while loop with Iterations,对吗?我认为在这种情况下,将数据存储在数据库中是首选方式。您可以从任何地方获取更新的记录。如果数据是临时的,您可以创建内存数据库。我可以问您一个例子吗?我没有想象力如何做到这一点。这是关于房间数据库的:我什么都不知道关于房间数据库。我已经准备好了一个教程,但我不知道如何处理我的:
Some_类扩展了SQLiteOpenHelper
在这个类中,我用列创建了表,所以这个类必须保留,对吗?现在。当我制作示例性项目时,它在RecyclerView中完美显示,但当我使用数据库浏览程序时(例如Firefox有一些扩展)它之前没有显示任何列,我有所有的数据库结构(列名称和类型等),所以我的问题是它应该是这样的吗?
data_list7.set(modify_position,item);               
mAdapter_details.notifyItemChanged(modify_position);