片段中的ListView未刷新

时间:2015-09-03 16:55:36

标签: android listview android-fragments

我创建了一个标签式应用,主要活动包含两个布局。顶部布局包含实际的tabbar(这是一个片段)。根据用户单击的标签栏按钮,内容布局包含其他片段。为了与旧的Android版本保持兼容,我使用android.support.v4.app.Fragment

因此,在标签栏菜单中我添加了两个按钮,每个按钮触发内容中的另一个片段。这就是代码的样子:

public class TabbarMenuFragment extends Fragment implements View.OnClickListener {

    LiveFragment liveFragment;
    OddsFragment oddsFragment;
    FragmentTransaction fragmentTransaction;
    Button liveButton;
    Button oddsButton;

    public TabbarMenuFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        liveFragment = new LiveFragment();
        oddsFragment = new OddsFragment();
        fragmentTransaction = getFragmentManager().beginTransaction().add(R.id.content_view, oddsFragment);
        fragmentTransaction.commit();

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

        liveButton = (Button) rootView.findViewById(R.id.liveButton);
        liveButton.setOnClickListener(this);

        oddsButton = (Button) rootView.findViewById(R.id.oddsButton);
        oddsButton.setOnClickListener(this);

        return rootView;
    }



    public void updateUIInTabs() {
        liveFragment.updateUI();
    }


    @Override
    public void onClick(View v) {
        if(v == liveButton) {
            fragmentTransaction = getFragmentManager().beginTransaction().replace(R.id.content_view, liveFragment);
            fragmentTransaction.commit();
        }

        if(v == oddsButton) {
            fragmentTransaction = getFragmentManager().beginTransaction().replace(R.id.content_view, oddsFragment);
            fragmentTransaction.commit();
        }

        updateUIInTabs();
    }
}

重要的是,liveFragmentFragment,其中包含ListView

public class LiveFragment extends Fragment {

    LiveMainAdapter adapter;
    ListView list;
    LayoutInflater inflater;
    View rootView;

    public LiveFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        this.inflater = inflater;
        rootView = (View) inflater.inflate(R.layout.live_fragment, container, false);

        adapter = new LiveMainAdapter(inflater);
        list = (ListView) rootView.findViewById(R.id.live_fragment_ListView);
        list.setAdapter(adapter);
        list.setDivider(null);
        list.setDividerHeight(0);

        return rootView;
    }


    public void updateUI() {
        if(list != null) {
            list.invalidate();
            adapter.createRowObjects();
            adapter.notifyDataSetChanged();
        }
    }

}

到目前为止,oddsFragment只是一个假人,TextView

public class OddsFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = (View) inflater.inflate(R.layout.odds_fragment, container, false);
        return rootView;
    }
}

现在有两个重要的设置:

首先:

如上所述:我启动应用程序并初始显示oddsFragment。现在,当我点击liveFragment按钮时,liveFragment' ListView未更新。 再次单击oddsFragment按钮oddsFragment已正确显示。点击返回liveFragment我什么都没得到 - 没有显示ListView

第二个设定:

与第一个完全相同,但我将liveFragment设置为TabbarMenuFragment我替换的初始视图:

fragmentTransaction = getFragmentManager().beginTransaction().add(R.id.content_view, oddsFragment);

fragmentTransaction = getFragmentManager().beginTransaction().add(R.id.content_view, liveFragment);

然后正确显示ListView并更新列表视图中的数据并正确显示。但是,如果我点击oddsFragement,然后再点击liveFragementListView就会消失。

我已经尝试了两个多小时不同的事情而且我非常绝望,因为我不知道这种有线行为可能是什么原因。

有人知道这里发生了什么事吗?

1 个答案:

答案 0 :(得分:0)

试一试......

LiveFragment添加HandlerRunnable并从Runnable更新用户界面。

Handler handler = new Handler();
Runnable updater = new Runnable()
{
  public void run()
  {
    if(list != null) {
        list.invalidate();
        adapter.createRowObjects();
        adapter.notifyDataSetChanged();
    }
  }
};

然后更改updateUI()

中的LiveFragment方法
public void updateUI()
{
  handler.post(updater);
}