ListView片段丢失时,改变到另一个选项卡



我有一个活动与ActionBartabs。每个选项卡代表一个片段,都在唯一的活动中运行。

我有一个Spinner和ListView在第一个fragment。当项目在Spinner中被选中时,ListView的数据被修改并正确显示。

当我选择第二个选项卡,在那里做一些事情并导航回第一个选项卡时,问题发生了。之后,ListView不更新时,项目选择在旋转器。

RouteFragment:

public class RouteFragment extends FragmentBase {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) {
        View fragView = inflater.inflate(R.layout.route, container, false);
        Spinner spinner = (Spinner) fragView.findViewById(R.id.route_list);
        ArrayAdapter<Route> routeListAdapter = new ArrayAdapter<Route>(this.getActivity(), 
                android.R.layout.simple_spinner_item, 
                this.adapter.getRouteList());
        spinner.setAdapter(routeListAdapter);

        long routeId = ((Route) spinner.getSelectedItem()).Id;
        ListView lv = (ListView) fragView.findViewById(R.id.client_list);
        final ClientAdapter clientListAdapter = new ClientAdapter(this.getActivity(), 
                R.layout.route_listview,
                this.adapter.getClientList(routeId));
        lv.setAdapter(clientListAdapter);

        routeListAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setOnItemSelectedListener(new RouteSpinnerItemSelectedListener(lv));
        return fragView;
    }
}

RouteSpinnerItemSelectedListener:

public class RouteSpinnerItemSelectedListener implements OnItemSelectedListener {
    private ListView lv;
    public RouteSpinnerItemSelectedListener(ListView fragView) {
        this.lv = fragView;
    }
    @Override
    public void onItemSelected(AdapterView<?> parent, View view,
            int position, long id) {
        Route route = (Route) parent.getItemAtPosition(position);
        android.util.Log.v("Salesman", "selected route id: " + route.Id);
        android.util.Log.v("Salesman", "selected route name: " + route.Name);

        ClientAdapter clientAdapter = (ClientAdapter) lv.getAdapter();
        Log.v("Salesman", "before clear: " + clientAdapter.getCount() + "");
        clientAdapter.clear();
        Log.v("Salesman", "after clear: " + clientAdapter.getCount() + "");
        List<Client> clientList = DataAdapter.getInstance(Main.getContext())
        .getClientList(route.Id);
        Log.v("Salesman", "raw from DB" + clientList.size() + "");
        clientAdapter.addAll(clientList);
        Log.v("Salesman", "after addAll()"  +  clientAdapter.getCount() + "");
        clientAdapter.notifyDataSetChanged();
    }
    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // TODO Auto-generated method stub
    }
}

TabListener:

public class TabListener implements ActionBar.TabListener {
    private FragmentBase mFragment;
    public TabListener(FragmentBase fragment) {
        this.mFragment = fragment;
    }
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.add(R.id.fragment_content, mFragment, mFragment.getName());
    }
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(mFragment);
    }
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        android.util.Log.v("Salesman", "reselected");
    }
}

列表clientList,这是我从数据库中得到的,不是空的,我已经检查过了,正如你在代码中看到的。然而,ListView是空的,没有反应,仍然是空的。

我想关键是我失去了我的ListView的地方,但我只是不明白在哪里。

还有一件事:只有当我从一个选项卡移动到另一个选项卡时,这个问题才会发生。当我移动到我的应用程序中的另一个活动,然后移动回来,我仍然可以看到listview(它不是空的),可以更新它。

你能指出来吗?

我认为这发生在处理片段事务后,他们的状态改变,

getFragmentManager().beginTransaction().show(fragment).commitAllowingStateLoss();

getFragmentManager().beginTransaction().add(R.id.layout,fragment).commitAllowingStateLoss();

getFragmentManager().beginTransaction().replace(R.id.layout,fragment).commitAllowingStateLoss();

,

getFragmentManager().executePendingTransactions();

编辑…… RouteSpinnerItemSelectedListener

public class RouteSpinnerItemSelectedListener implements OnItemSelectedListener {
private ListView lv;
public RouteSpinnerItemSelectedListener(ListView fragView) {
    this.lv = fragView;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view,
        int position, long id) {
 if(lv!=null)
 {
    Route route = (Route) parent.getItemAtPosition(position);
    android.util.Log.v("Salesman", "selected route id: " + route.Id);
    android.util.Log.v("Salesman", "selected route name: " + route.Name);

    ClientAdapter clientAdapter = (ClientAdapter) lv.getAdapter();
   if(clientAdapter !=null)
   {
    Log.v("Salesman", "before clear: " + clientAdapter.getCount() + "");
    clientAdapter.clear();
    Log.v("Salesman", "after clear: " + clientAdapter.getCount() + "");
    List<Client> clientList = DataAdapter.getInstance(Main.getContext())
    .getClientList(route.Id);
    Log.v("Salesman", "raw from DB" + clientList.size() + "");
    clientAdapter.addAll(clientList);
    Log.v("Salesman", "after addAll()"  +  clientAdapter.getCount() + "");
    clientAdapter.notifyDataSetChanged();
   }
   else
   {
      ClientAdapter clientAdapter = = new ClientAdapter(this.getActivity(), 
            R.layout.route_listview,
            this.adapter.getClientList(routeId));
      List<Client> clientList = DataAdapter.getInstance(Main.getContext())
      .getClientList(route.Id);
      clientAdapter.clear();
      clientAdapter.addAll(clientList);
      lv.setAdapter(clientListAdapter);
   }
 }
 else
 {
      lv=(ListView)getActivity.findViewById(R.id.route_list);
      ClientAdapter clientAdapter = = new ClientAdapter(this.getActivity(), 
            R.layout.route_listview,
            this.adapter.getClientList(routeId));
      List<Client> clientList = DataAdapter.getInstance(Main.getContext())
      .getClientList(route.Id);
      clientAdapter.clear();
      clientAdapter.addAll(clientList);
      lv.setAdapter(clientListAdapter);
 }
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
    // TODO Auto-generated method stub
 }
}

最新更新