You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Fragment中访问Main Activity声明的ArrayList并实现自定义列表展示?

在Fragment中访问MainActivity的ArrayList的几种方法

嘿,我来给你几个实用的方案,帮你在Fragment里拿到MainActivity中声明的ArrayList<Users>:

方法一:通过强转宿主Activity直接获取

这是最直接的方式,因为Fragment依附于MainActivity,你可以通过getActivity()拿到宿主实例,强转成MainActivity后就能访问里面的列表了。不过要注意两点:要么把users变量设为public,要么给它写个公共的getter方法。

代码示例:

MainActivity中调整:

// 方式1:把users设为public
public ArrayList<Users> users;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 初始化并填充默认值
    users = new ArrayList<Users>();
    users.add(new Users("张三"));
    users.add(new Users("李四"));
    // 加载Fragment...
}

// 方式2:写个getter方法(更推荐,封装性更好)
public ArrayList<Users> getUsers() {
    return users;
}

Fragment中获取:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.your_fragment_layout, container, false);
    
    // 方式1:直接访问public变量
    // ArrayList<Users> activityUsers = ((MainActivity) getActivity()).users;
    
    // 方式2:调用getter方法(更安全)
    ArrayList<Users> activityUsers = ((MainActivity) getActivity()).getUsers();
    
    UserAdapter<Users> adapter = new UserAdapter<>(getActivity(), activityUsers);
    // 给RecyclerView设置adapter...
    
    return view;
}

注意:使用前最好判断getActivity()不为null,并且是MainActivity的实例,避免空指针或类型转换异常:

if (getActivity() instanceof MainActivity) {
    ArrayList<Users> activityUsers = ((MainActivity) getActivity()).getUsers();
    // 后续操作
}

方法二:使用ViewModel共享数据(推荐)

这种方式更符合Android的组件化架构思想,ViewModel可以在Activity和它的Fragment之间共享数据,不用依赖Activity的实例,还能避免内存泄漏问题。

代码示例:

第一步:创建共享的ViewModel

import androidx.lifecycle.ViewModel;
import java.util.ArrayList;

public class SharedUserViewModel extends ViewModel {
    private ArrayList<Users> users;

    public void setUsers(ArrayList<Users> users) {
        this.users = users;
    }

    public ArrayList<Users> getUsers() {
        return users;
    }
}

第二步:MainActivity中给ViewModel设置数据

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 初始化列表
    ArrayList<Users> users = new ArrayList<Users>();
    users.add(new Users("张三"));
    users.add(new Users("李四"));
    
    // 获取ViewModel实例(注意用Activity的ViewModelProvider)
    SharedUserViewModel viewModel = new ViewModelProvider(this).get(SharedUserViewModel.class);
    viewModel.setUsers(users);
    
    // 加载Fragment...
}

第三步:Fragment中从ViewModel获取数据

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.your_fragment_layout, container, false);
    
    // 获取和Activity共享的ViewModel实例
    SharedUserViewModel viewModel = new ViewModelProvider(requireActivity()).get(SharedUserViewModel.class);
    ArrayList<Users> activityUsers = viewModel.getUsers();
    
    UserAdapter<Users> adapter = new UserAdapter<>(getActivity(), activityUsers);
    // 设置adapter到RecyclerView...
    
    return view;
}

方法三:通过Bundle传递数据(适合初始化时传递)

如果你的列表是在Fragment创建时就需要的,可以把数据放进Bundle,通过setArguments()传递给Fragment,适合一次性传递的场景。

代码示例:

MainActivity中传递数据

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    ArrayList<Users> users = new ArrayList<Users>();
    users.add(new Users("张三"));
    users.add(new Users("李四"));
    
    // 创建Fragment并传递数据
    YourFragment fragment = new YourFragment();
    Bundle args = new Bundle();
    // 注意:Users类需要实现Serializable或Parcelable接口
    args.putSerializable("USER_LIST", users);
    fragment.setArguments(args);
    
    // 提交Fragment事务...
}

Fragment中获取数据

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.your_fragment_layout, container, false);
    
    if (getArguments() != null) {
        // 取出数据
        ArrayList<Users> activityUsers = (ArrayList<Users>) getArguments().getSerializable("USER_LIST");
        UserAdapter<Users> adapter = new UserAdapter<>(getActivity(), activityUsers);
        // 设置adapter...
    }
    
    return view;
}

注意:这种方式要求Users类实现Serializable或者Parcelable接口,否则无法序列化传递。

内容的提问来源于stack exchange,提问作者user8466504

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:41:13