【问题标题】:Share data between fragments在片段之间共享数据
【发布时间】:2020-02-22 21:53:59
【问题描述】:

我正在 android 上制作一个 bugtracker 应用程序,其中我有一个名为 Task 的类,它有一个“类别”字段,用于定义任务是否已完成、正在进行或必须执行。

我在其中添加了一些想法“项目”以设置 ViewModel

public class ProjectFragment extends Fragment {

private static final String TAG = "ProjectFragment";

private UserViewModel model;
private GridViewAdapter gridViewAdapter;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_projects, container, false);

    model = ViewModelProviders.of(requireActivity()).get(UserViewModel.class);
    GridView gridView = view.findViewById(R.id.gridview_project);
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Project temp = Objects.requireNonNull(model.getCurrentuser().getValue()).getProjects().get(position);
            model.setCurrproject(temp);
            Log.i(TAG, "onItemClick: " + temp.getProjectName());
            model.setTodoTasks(TaskSorter.getSortedTaskList(temp, "TODO"));
            model.setInprogressTasks(TaskSorter.getSortedTaskList(temp, "IN PROGRESS"));
            model.setDoneTasks(TaskSorter.getSortedTaskList(temp, "DONE"));

        }
    });
    gridViewAdapter = new GridViewAdapter(requireActivity(), Objects.requireNonNull(model.getCurrentuser().getValue()).getProjects());
    gridView.setAdapter(gridViewAdapter);
    model.getCurrentuser().observe(this, new Observer<User>() {
        @Override
        public void onChanged(User user) {
            gridViewAdapter.notifyDataSetChanged();

        }
    });

    FloatingActionButton floatingActionButton = view.findViewById(R.id.floatingActionButton);
    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            openProjectDialog();
        }
    });

    return view;
}

我也有 3 个片段用于我观察变化的相应类别。

public class FragmentToDo extends Fragment {

private static final String TAG = "FragmentToDo";

private ListView listView;
private UserViewModel model;
private ListViewAdapter listViewAdaptertodo;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_todo, container, false);
    listView = view.findViewById(R.id.todo_list);
    model = ViewModelProviders.of(this).get(UserViewModel.class);
    model.gettodoTasks().observe(this, new Observer<ArrayList<Task>>() {
        @Override
        public void onChanged(ArrayList<Task> tasks) {
            listViewAdaptertodo.notifyDataSetChanged();
            Log.i(TAG, "onChanged: todo");
        }
    });
    initTodo();
    return view;
}

private void initTodo(){
    listViewAdaptertodo = new ListViewAdapter(requireActivity(), model.gettodoTasks().getValue());
    listView.setAdapter(listViewAdaptertodo);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            openTask();
        }
    });
}

所有 3 个片段看起来都是这样的,当然名称不同。每当我点击一个项目时,都会发生一些变化,但不是全部。这 3 个类别由 ViewPager 保存,但我不确定问题出在哪里。如果这里也有代码:

public class TaskFragment extends Fragment {

private static SectionsPagerAdapter sectionsPagerAdapter;
private ArrayList<Task> todo;
private ArrayList<Task> inp;
private ArrayList<Task> done;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_task, container, false);
    sectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
    sectionsPagerAdapter.addFragments(new FragmentToDo(), "To Do");
    sectionsPagerAdapter.addFragments(new FragmentInProgress(), "In Progress");
    sectionsPagerAdapter.addFragments(new FragmentDone(), "Done");
    ViewPager viewPager = view.findViewById(R.id.view_pager);
    viewPager.setAdapter(sectionsPagerAdapter);
    TabLayout tabs = view.findViewById(R.id.tabs);
    tabs.setupWithViewPager(viewPager);
    return view;
}

}

也许问题是每当我定义上下文和生命周期所有者时,因为我是一个新手 android 开发人员,我仍然对这些主题知之甚少。

【问题讨论】:

    标签: android android-fragments mvvm viewmodel android-viewmodel


    【解决方案1】:

    有一种简单且不可扩展的方式——例如 eventbus,this

    首选方式 - 将您的应用程序逻辑从片段移动到其他组件,数据仅以一种方式传递。即有一个组件,它暴露了你的屏幕的某种模型,它得到了更新——片段/视图/活动反映了这种变化。您可以查看示例应用程序here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      相关资源
      最近更新 更多