【问题标题】:ListFragment loads empty list after coming back from BackStackListFragment 从 BackStack 回来后加载空列表
【发布时间】:2014-05-23 02:21:42
【问题描述】:

这是我在同一问题上的第二个帖子,我仍在等待有人指导我。我面临的问题可能很简单,简而言之,我有这个ListFragment,它填充了调用网络服务的列表,这很好用。当用户选择任何项目时,我会替换另一个片段并将其添加到 BackStack

问题从这里开始,它会弹出ListFragment,但它总是为空或空白。但是我已经以各种可能的方式检查了日志,发现数据在那里,由于某种原因,列表保持空白。请有人帮我...

在 MainActivity 我使用DrawerItemCustomAdapter,这就是我替换片段的方式

private void selectItem(int position) {

    android.support.v4.app.Fragment fragment = null;

    switch (position) {
    case 0:
    {
        fragment = new EventFragment();
    }
        break;
    case 1:
        fragment = new ScheduleFragment();
        break;
    case 2:
        fragment = new NewsFragment();
        break;
    case 3:
        fragment = new TeamFragment();
        break;
    case 4:
        fragment = new VenueFragment();
        break;
    case 5:
        fragment = new NewsFragment();
        break;

    default:
        break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();  

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(mNavigationDrawerItemTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);

    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }

}

在 EventFragment 中我使用FragmentStatePagerAdapter 创建ViewPager

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

    View rootView = inflater.inflate(R.layout.event_fragment, container, false);

    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();

    viewpager = (ViewPager)rootView.findViewById(R.id.pager);

    viewpager.setAdapter(new MyAdapter(fragmentManager));

    return rootView;
}

在 MyAdapter 类中

    class MyAdapter extends FragmentStatePagerAdapter {

        FragmentManager fragmentManager;
    public MyAdapter(FragmentManager fm) {
            super(fm);
            // TODO Auto-generated constructor stub
            fragmentManager = fm;
        }

    @Override
    public Fragment getItem(int i) {
        Fragment fragment = null;

        if(i == 0)
        {
            fragment = new LiveFragment();
        }
        if(i == 1)
        {
            fragment = new UpcomingFragment();
        }
        if(i == 2)
        {
            fragment = new CompletedFragment();
        }

        return fragment;
    }
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 3;
}

@Override
    public CharSequence getPageTitle(int position) {
        if(position == 0)
        {
            return "Live";
        }
        if(position == 1)
        {
            return "Up-Coming";
        }
        if(position == 2)
        {
            return "Completed";
        }

        return null;
    }
    }

三个标签都是 ListFragment 让我们选择第一个

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if (isVisibleToUser) {

                LiveMatchList = new ArrayList<HashMap<String, Object>>();
                adapter = null;
                Log.d("LiveMatchList setUserVisibleHint","setUserVisibleHint");
                new LoadUpcomingMatchList().execute();          
        }
    }

我的 LoadUpcomingMatchList 类扩展了 AsyncTask,在 onPreExecute 和 doInBackground 之后我像这样设置适配器

protected void onPostExecute(String file_url) {
            try
            {
                if (pDialog != null) { 
                    pDialog.dismiss();
               }
                //pDialog.dismiss();
                /**
                 * Updating parsed JSON data into ListView
                 * */
                adapter = new SimpleAdapter(
                        getActivity(),LiveMatchList,
                        R.layout.live_list_row, new String[] { TAG_DateTimeLabel, "eventName", TAG_roundName, TAG_Venue, "team1Flag", "team2Flag" },
                        new int[] { R.id.livematchDate, R.id.livematchName, R.id.liveround, R.id.livevenue, R.id.liveteam1flag, R.id.liveteam2flag });
                // updating listview
                setListAdapter(adapter);
                Log.d("LiveMatchList onPostExecute",String.valueOf(LiveMatchList));
            }
            catch(Exception ex)
            {
                Log.d("onPostExecute", ex.toString());
            }

        }

我已经按照你的建议实现了 onListItemClick 从 MainActivity 转到详细信息页面。

@Override
    public void onListItemClick(ListView l, View v, int position, long id) { 

        @SuppressWarnings("unchecked")
        HashMap<String,String> selectedItem = (HashMap<String, String>) getListView().getItemAtPosition(position);
        Bundle dataBundle = new Bundle();
        dataBundle.putString("team1Id", selectedItem.get(TAG_homeTeamId));
        dataBundle.putString("team2Id", selectedItem.get(TAG_awayTeamId));


        ((MainActivity)getActivity()).doTransaction("LiveFragment", dataBundle);

        Fragment fragment = new LiveMatchDetailMainFragment();
        fragment.setArguments(dataBundle);
        android.support.v4.app.FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.content_frame, fragment);
        fragmentTransaction.addToBackStack("LiveFragment");
        fragmentTransaction.commit();
    }

详情页又是一个实现了 viewPager 的片段。现在,当我从详细信息页面按下后退按钮时,它会按预期加载上一个片段,并且我检查了日志,在那里我可以看到 setUserVisibleHint 被调用并且选项卡按预期加载但选项卡中没有任何内容,应该有一个列表.请参考图表,如果有帮助,非常感谢您的帮助。我已经在这个问题上浪费了 3/4 天。

   [MainActivity]
         |
         V
   [EventFragment]
   |     |      | 
   V     V      V
[Tab1] [Tab2] [Tab3]

[Tab1] 是一个 ListFragment 实现 onListItemClick -> Detail Fragment。

【问题讨论】:

    标签: android android-fragments android-listfragment back-stack android-nested-fragment


    【解决方案1】:

    您是否在 ListFragment 中进行片段事务?在 FragmentActivity 中执行此操作并使用您的 onListItemClick() 回调方法调用应该运行事务的 FragmentActivity 方法。

    在 EventFragment 中替换:

    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
    viewpager.setAdapter(new MyAdapter(fragmentManager));
    

    与:

    viewpager.setAdapter(new MyAdapter(getChildFragmentManager()));
    

    【讨论】:

    • 谢谢,是的,我正在 ListFragment 中进行交易,因为我必须添加一些值到 bundle 并将其传递给详细的片段,现在我应该在我的 ListFragment 和 getFragmentManager 中创建 bundle () 然后将它们传递给 FragmentActivity 的方法并在那里进行事务?另一件事是 onBackPressed() 方法好吗?我写的?再次感谢您。
    • 通常,您只需要从 onListItemClick() 传递位置或 id,指示要显示哪个列表项“详细信息”。例如,在您的 FragmentActivity 上创建一个方法 showDetails()。它将接收从 onListItemClick() 传递的位置或 id,它应该处理片段事务并创建要发送到您的“DetailsFragment”的捆绑包。这样做不需要重写 FragmentActivity.onBackPressed() 方法,当您按下智能手机上的后退按钮时,默认行为是返回到您放入后退堆栈的最后一个片段。
    • 很好,在 MainActivity 中实现该方法并删除 onBackPressed() 工作正常,谢谢。当我按下它时,它会将我带到上一个片段,但同样的事情......我的 ListFragment 是空的,它显示一个空白屏幕。我在这里错过了一些重要的部分吗?让我给你一个场景: MainActivity -> Fragment(A)[FragmentStatePagerAdapter,有三个滑动选项卡,每个都是一个 Fragment] Fragment(A)TB1[ is a ListFragment] Fragment(A)TAB2[ is a ListFragment] Fragment (A)TAB3[ is a ListFragment] Fragment(A)TAB1 -> DetailsFragment 有什么建议吗?
    • 尝试使用 FragmentPagerAdapter 而不是 FragmentStatePagerAdapter,最后一个销毁片段,第一个只销毁视图层次结构,但它保留了实例。
    • 另外,当你去 DetailsFragment 时,你的其他片段应该调用 onDestroyView() 并且当你返回时,在你的其他片段中调用 onCreateView(),所以确保你正在填充你的列出该回调方法中的视图。假设您的数据在 ArrayList 中: if(myArrayList != null) { //fill list view }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2020-06-10
    • 1970-01-01
    • 2020-05-20
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多