Java 将列表从主活动传递到选项卡片段回收视图

Java 将列表从主活动传递到选项卡片段回收视图,java,android,android-activity,android-recyclerview,fragment,Java,Android,Android Activity,Android Recyclerview,Fragment,我的活动有4个选项卡,每个选项卡都有RecyclerView。我在MainActivity中获取Json数据,然后将其转换为列表 这里的挑战是将列表传递给每个选项卡中每个片段中的每个RecyclerView。最简单的方法是这样使用: 视图模型: public class SharedViewModel extends ViewModel { private List<Item> list_1= ArrayList<Item>(); private List

我的活动有4个选项卡,每个选项卡都有
RecyclerView
。我在
MainActivity
中获取Json数据,然后将其转换为列表


这里的挑战是将列表传递给每个选项卡中每个
片段中的每个
RecyclerView

最简单的方法是这样使用:

视图模型:

public class SharedViewModel extends ViewModel {
    private List<Item> list_1= ArrayList<Item>();
    private List<Item> list_2= ArrayList<Item>();

    public void setList_1(List<Item> list) {
        list_1 = list
    }

    public List<Item> getList_1() {
        return list_1 ;
    }

    public void setList_2(List<Item> list) {
        list_2 = list
    }

    public List<Item> getList_2() {
        return list_2 ;
    }
}
片段1:

public class Fragment_1 extends Fragment {

    private SharedViewModel model;
    List<Item> list_1 = new ArrayList<>();

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        list_1 = model.getList_1();
    }
}
公共类片段\u 1扩展了片段{
私有共享模型;
List_1=新的ArrayList();
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
model=ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
list_1=model.getList_1();
}
}
片段2:

public class Fragment_2 extends Fragment {

    private SharedViewModel model;
    List<Item> list_2 = new ArrayList<>();

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        list_2 = model.getList_2();
    }
}
公共类片段\u 2扩展了片段{
私有共享模型;
List_2=新的ArrayList();
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
model=ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
list_2=model.getList_2();
}
}

但是,更好的方法更复杂。更多的信息在这里

您可以考虑在<代码>片段中使用<代码> BurdCaster接收器<代码>。因此,当更新片段列表时,您将从
main活动
发送一个广播,该广播将在片段中接收

您只需像这样在
片段中注册
BroadcastReceiver

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Get extra data included in the Intent
        // You might consider sending a list to be passed to the adapter of the RecyclerView. 
        String data = intent.getStringExtra("data");
        // Update your RecyclerView with data. 
    }
};
onResume
函数中的
Fragment
中注册接收器

@Override
protected void onResume() {
    // Register to receive messages.
    // We are registering an observer (mMessageReceiver) to receive Intents
    // with actions named "update-frag-1-recyclerview".
    LocalBroadcastManager.getInstance(this).registerReceiver(
            mMessageReceiver, new IntentFilter("update-frag-1-recyclerview"));
    super.onResume();
}
并在
片段中的
onPause
函数中取消注册接收器

@Override
protected void onPause() {
    // Unregister since the Fragment is paused.
    LocalBroadcastManager.getInstance(this).unregisterReceiver(
            mMessageReceiver);
    super.onPause();
}
现在,从您的
活动
中,当接收到数据并准备好将数据传递给片段时,只需发送相应的广播以供片段接收。我正在展示一个

Intent intent = new Intent("update-frag-1-recyclerview");
// You can also include some extra data.
intent.putExtra("data", "This is some data!");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
这将在您收听来自
Fragment1
的事件时触发
onReceive
功能。您也可以对其他片段执行相同的操作。请记住,我只发送一个数据,即
String
。您可以考虑发送一个列表以及一个额外的内容,以及在片段< /代码>中接收的意图。
@Override
protected void onPause() {
    // Unregister since the Fragment is paused.
    LocalBroadcastManager.getInstance(this).unregisterReceiver(
            mMessageReceiver);
    super.onPause();
}

希望有帮助

你能给我们看一些你的代码吗,特别是主要的活动和fragmens实例化?