在片段之间切换时保存列表视图项

时间:2019-12-22 16:42:29

标签: android

我正在构建一个聊天应用程序。我有一个ChannelFragment,其中包含可以通过按按钮填充的频道列表视图。当我单击一个项目时,我移到另一个名为MessageFragment的片段,其中包含来自该频道的聊天。但是,当我使用导航栏导航到ChannelFragment时,整个列表视图将刷新,并且没有任何内容。

切换到消息片段后,如何在列表视图中保存创建的项目?谢谢。

我的ChannelFragment中的列表视图

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    channelList = new ArrayList<>();

    Bundle bundle = getArguments();
    if (bundle != null) {
        nick = bundle.getString("nick");
        channel = bundle.getString("channel");
    }

    channelList.add(new Channel(channel, "0 people"));

    channelListView = getView().findViewById(R.id.channelListView);
    adapter = new ChannelListAdapter(getActivity(), R.layout.adapter_view_channel_layout, channelList);
    channelListView.setAdapter(adapter);

    channelListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {
            Channel item = adapter.getItem(position);
            Bundle messageBundle = new Bundle();
            messageBundle.putString("nick",nick);
            messageBundle.putString("channel",item.getChannelName());
            MessageFragment messageFragment = new MessageFragment();
            messageFragment.setArguments(messageBundle);

            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.layout_for_fragments, messageFragment, "MessageF").commit();
        }
    });


}

我如何导航到它

  @Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {

    int id = menuItem.getItemId();

    if (id == R.id.channels) {
        ChannelFragment channelFragment = new ChannelFragment();
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.layout_for_fragments, channelFragment, "Channel Fragment");
        fragmentTransaction.commit();
    }

第一个图片是我创建商品时的图片,第二个图片是我从消息片段中导航回来的图片 When I create the list view

When I come back to it from the message fragment

1 个答案:

答案 0 :(得分:1)

此答案分为两部分

1),因为每次调用channelList = new ArrayList<>();时,您在onViewCreatedonViewCreated都是在擦除列表。此时不要创建新列表,在将变量定义为类的成员时创建空列表,例如定义channelList变量的类型。

切换到新片段时,通常会将旧的片段实例放到堆栈中,然后在返回到片段时重新使用。

此刻,new中的onViewCreated正在清除您从后退堆栈返回的列表。

例如该代码将类似于

public class ChannelFragment extends Fragment {
  private ArrayList<Channel> channelList = new ArrayList<>();
....

2) 使您Channel对象可包裹

教程https://www.vogella.com/tutorials/AndroidParcelable/article.html

然后您可以使用onSaveInstanceState()onRestoreInstanceState()

如果片段被破坏,则使用writeParcelableListwriteTypedList存储频道列表

请参见https://www.dev2qa.com/android-fragment-save-retrieve-instance-state-example/