1

基本的にリストビューであるフラグメントがあります。親アクティビティは、サービスから名簿アイテムのリストを取得するメソッドを呼び出します。データがサービスから返されるとき、通過するフラグメントとRosterアイテムのArrayListでupdateRosterItemsを呼び出します。問題は、最初から機能することですが、別のタブを選択してからフラグメントのあるタブに戻ると、getActivity()がnullを返し、データをArrayAdapterに接続できません。

これは、updateRosterItems関数のコードです。

public void updateRosterList(ArrayList<RosterInfo> rosterItems)
{
    if(_adapter == null)
    {
        _adapter = new RosterItemAdapter(getActivity(), R.layout.roster_listview_item, rosterItems);
    }

    Activity activity = getActivity();
    if(activity != null)
    {
        ListView list = (ListView)activity.findViewById(R.id.lstRosterItems);

        list.setAdapter(_adapter);
        _adapter.notifyDataSetChanged();
    }
}

フラグメントが添付される前にコードが呼び出されることによって引き起こされる同様の問題について読みました。私の質問は、onAttachが呼び出されるまでupdateRosterListへの呼び出しを遅らせる方法はありますか?私が試している解決策は、getActivity()がnullを返した場合、データをフラグメントのプライベート変数に格納し、onAttachメソッドでvarialbeにデータがあるかどうかを確認してから、アダプターで更新を呼び出すことです。しかし、これは少しハッキーなようです。何か案は?

4

2 に答える 2

2

更新:これを行うことで、なんとか機能させることができました。私はAndroid開発にまったく慣れていないので、解決策としては少しハッキーなようです。もっと良い方法はありますか?基本的に、updateRosterList関数は、フラグメントの外部から呼び出される関数です。

public class RosterListFragment extends Fragment {

RosterItemAdapter _adapter = null;
private ArrayList<RosterInfo> _items;

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

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);

    if(_items != null)
    {
        performUpdateRosterList(_items);
    }

}

public void updateRosterList(ArrayList<RosterInfo> rosterItems)
{
    Activity activity = getActivity();
    if(activity != null)
    {
        performUpdateRosterList(rosterItems);
    }
    else
    {
        _items = rosterItems;
    }
}

private void performUpdateRosterList(ArrayList<RosterInfo> rosterItems)
{
    Activity activity = getActivity();
    if(_adapter == null)
    {
        _adapter = new RosterItemAdapter(activity, R.layout.roster_listview_item, rosterItems);
    }

    ListView list = (ListView)activity.findViewById(R.id.lstRosterItems);

    list.setAdapter(_adapter);
    _adapter.notifyDataSetChanged();
}

}
于 2012-12-10T01:07:34.833 に答える
1

正解です。アクティビティはまだ添付されていません。これを処理する方法は2つあります。

  1. アクティビティが添付されるまで変更を加えないでください。おそらく、rosterItemsを保存して、後で更新するだけです。
  2. コンテキストをアップデーター関数に渡します。

個人的には、最初の方がおそらくより良い方法だと思いますが、どちらでも問題なく動作する可能性があります。

于 2012-12-10T00:49:58.787 に答える