1

私は と で活動しActionBarていtabsます。各タブは 1 つのフラグメントを表し、すべてが唯一のアクティビティ内で実行されます。

最初の 内に Spinner と ListView がありfragmentます。Spinner でアイテムを選択すると、ListView のデータが変更され、正しく表示されます。

この問題は、2 番目のタブを選択し、そこで何かをして、最初のタブに戻ると発生します。その後、ListViewスピナーでアイテムを選択しても更新されません。

ルートフラグメント:

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

    }
}

タブリスナー:

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");
    }

}

データベースから取得したListclientListは空ではありません。コードでわかるように、それを確認しました。ただし、ListView は空で反応せず、空のままです。

ポイントは、ListViewをどこかで失っているということだと思いますが、どこにあるのかわかりません。

1 つのこともあります。その問題は、あるタブから別のタブに移動するときにのみ発生します。アプリ内の別のアクティビティに移動してから戻ると、リストビューが表示され (空ではありません)、更新できます。

指していただけますか?

4

1 に答える 1

2

これは、状態が変化した後のフラグメントトランザクションの処理で発生すると思いますが、

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

 }
}
于 2013-03-27T06:11:41.383 に答える