Android,从其他片段返回的空列表视图

Posted

技术标签:

【中文标题】Android,从其他片段返回的空列表视图【英文标题】:Android, empty listview afrer back from other fragment 【发布时间】:2013-12-17 07:52:36 【问题描述】:

嘿,我的片段中有列表视图。我正在用我的另一个片段替换这个列表视图片段,但是当我想回到我的列表时,它是空的。我以为我可以恢复我的列表项,但我不知道如何。我假设根据片段生命周期,我的适配器将是可重用的,但看起来不是。这是我的代码:

public class ThreadListFragment extends Fragment implements FragmentConnectionStatus, ListFragment, OnClickListener, OnItemClickListener
       private ListView ListView;
       private PilotController Activity;
       private Button ButtonStartNewThread;
       private boolean Paused;
       private ThreadInfoAdapter adapter;

@Override
   public View onCreateView(LayoutInflater inflater,
      ViewGroup container, Bundle savedInstanceState) 
      /**
   * Inflate the layout for this fragment
   */
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.threads_list_fragment, container, false);
        System.out.println(this.Paused);
        if(this.Paused == false)
            this.ListView = (ListView) view.findViewById(R.id.listViewActiveThreads);
            ArrayList<Guid> strs = new ArrayList<Guid>();
            adapter = new ThreadInfoAdapter(view.getContext(), strs, this);
        
        this.ListView.setAdapter(adapter);
        this.ListView.setItemsCanFocus(true);
        this.ListView.setOnItemClickListener(this);
        this.Activity = (PilotController) getActivity();
        this.ButtonStartNewThread = (Button) view.findViewById(R.id.buttonStartThread);
        this.ButtonStartNewThread.setOnClickListener(this);
        return view;
   

@Override
public void onPause()

    super.onPause();
    this.Paused = true;

但是当我返回旧列表时,它是空的。你能给我一些建议吗?

解决方案

我找到了解决方案。 ListView 可能正在从“绘制堆栈”中删除,因此当调用 OnDeleteView 时,您的旧列表下次无法使用,尽管仍然设置了对该对象的引用。解决方案是重新创建 ListView 并设置旧适配器。由于本教程http://developer.android.com/guide/components/fragments.html 的这个适配器将继续存在,但视图被重新创建(所以旧的列表视图不再存在(它存在但它不可绘制)。我不得不改变这行:

    if(this.Paused == false)
        this.ListView = (ListView) view.findViewById(R.id.listViewActiveThreads);
        ArrayList<Guid> strs = new ArrayList<Guid>();
        adapter = new ThreadInfoAdapter(view.getContext(), strs, this);
    

到:

    this.ListView = (ListView) view.findViewById(R.id.listViewActiveThreads);
    if(this.Paused == false)
        ArrayList<Guid> strs = new ArrayList<Guid>();
        adapter = new ThreadInfoAdapter(view.getContext(), strs, this);
    

【问题讨论】:

【参考方案1】:

在“onActivityCreated”中,您可以检查您的 dataList(在您的情况下为“strs”)是否为空。如果不是,则使用它,否则创建一个新的。在代码中它看起来像这样:

public void onActivityCreated(@Nullable Bundle savedInstanceState) 
    super.onActivityCreated(savedInstanceState);

    if (strs == null)
        strs = new ArrayList<Guid>();

    mListView = (ListView)getActivity().findViewById(R.id.listViewActiveThreads);

    mPersonAdapter = new ArrayAdapterPerson(getActivity(),mPersonList,this);
    mListView.setAdapter(mPersonAdapter);


【讨论】:

【参考方案2】:

我在这里找到了我的解决方案:ListFragment is empty after going back

使用 transaction.hide(this):

ft.addToBackStack(null);
        ft.hide(this);
        ft.add(R.id.frag_frame, lyrics);
        ft.commit();

【讨论】:

糟糕的答案

以上是关于Android,从其他片段返回的空列表视图的主要内容,如果未能解决你的问题,请参考以下文章

如何从 postgresql 视图表中获取要显示的对象列表

在片段中使用列表视图

Android Java:在 onCreateView() 中返回空视图的片段

Android 4.3 上 ShinobiChart 的空实例

从列表视图中删除一行后刷新片段

从活动更新视图页面中片段中的列表视图