0

誰かが助けてくれることを願っています。サポート ライブラリを使用して、複数のリスト フラグメントをホストするフラグメントがあります。リストフラグメントは、親フラグメントの非同期タスクから取得したデータを表示することになっています。データが正しくロードされていないため、データがどのようにロードされているかを正確に把握しようとしています。

リスト表示フラグメントが起動されるたびに、非同期タスクを実行して、Json を取得して解析し、ArrayList <ArrayList <HashMap <String, String> > >

各 List フラグメントは、ArrayList 内のその位置にあるデータの親フラグメントを照会します。例えば。3 ページ目では、リストとして表示するための `ArrayList <HashMap <String, String> > を含む arrList[2] を取得する必要があります。

ページャーの動作がおかしい。フラグメントのライフサイクルやページャーがフラグメントをどのように使用するかを理解していない可能性があります。私は7つのフラグメントを持っています。frag3 から開始すると、ページャーにはデータのないフラグメント 3 が表示されます。また、データなしでフラグメント 2 と 4 をロードします。frag 1 に左に移動すると、fragment 1 が正しく表示され、fragment 0 が読み込まれます。frag 0 に適切に切り替えることができますが、frag 2 に切り替えると、frag 0 からデータが読み込まれ、frag 0 のデータが残りのすべてに読み込まれます。ビュー。十分に行き来すると、すべてのフラグメントのすべてのデータがfrag 0のデータに置き換えられます。ビューページャーの起動時にデータがないため、すぐにデータをロードしないと思います。非同期タスクをまだ待機させていません。

ビューから十分に離れた場所に移動するたびに、各フラグメントのビューが再描画されると考えました。だから私は更新をonCreateView()フラグメントの中に入れました。これは、置き忘れた、または見落としている小さなことのように感じます。実装しようとしましFragmentStatePagerAdapterたが、正しくやったとは思いません。

どんな助けも大歓迎です そして、私がひどく間違ったことをしているだけなら、私は議論に非常にオープンです. 私は通常そうします。失敗することはありません。すべてを書き直す必要があることを確認するために何かを作成します。

public class ListFragmentDisplay extends SherlockFragment {
public static final String TAG = "listFragmentDisplay";

Calendar calendar = Calendar.getInstance();
private int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
// listbyday is a list of hash maps each list of hash maps represents a day
// of the week with items for that Object
private ArrayList<ArrayList<HashMap<String, String>>> listByDay = null;
private String objectName = null;
private ViewPager pager;
private FragAdapter adapter;

public ArrayList<HashMap<String, String>> getList(int day) {
    return listByDay.get(day);

}
private void getObjectName() {
    barName = ((MainFragActivity) getActivity()).getobjectSelected();
}
public static ListFragmentDisplay newInstance() {
    return new ListFragmentDisplay();
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Inflate the ListView layout file.
    initArrList();
    getObjectName();
    fillList();
    return inflater.inflate(R.layout.list_view, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    pager = (ViewPager) view.findViewById(R.id.viewPager);
    adapter =new FragAdapter(getChildFragmentManager());
    if (pager.getAdapter() == null)
        pager.setAdapter(adapter);
    reload();
    pager.setOnPageChangeListener(new OnPageChangeListener() {
        @Override
        public void onPageScrollStateChanged(int arg0) {}

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {reload();}
        
        @Override
        public void onPageSelected(int arg0) {  
        }
    });
    pager.setCurrentItem(dayOfWeek-1);
}
private void initArrList() {
    if (listByDay == null) {
        listByDay = new ArrayList<ArrayList<HashMap<String, String>>>();
    } else {
        listByDay.clear();
    }
    for (int i = 0; i < 7; i++) {
        ArrayList<HashMap<String, String>> hm = new ArrayList<HashMap<String, String>>();
        listByDay.add(hm);
    }
}
synchronized private void fillList() {
    LoadWebTask lWT = new LoadWebTask();
    executeAsyncTask(lWT, getSherlockActivity().getApplicationContext());
}

FragmentPager

public class FragAdapter extends FragmentPagerAdapter {
private static final String[] CONTENT = new String[] { "frag0", "frag1",
        "frag2", "frag3", "frag4", "frag5", "frag6" };
public FragAdapter(FragmentManager fm) {
    super(fm);

}
@Override
public Fragment getItem(int arg0) {
    return MyListFragment.newInstance(arg0);
}
@Override
public int getCount() {
    return CONTENT.length;
}
@Override
public CharSequence getPageTitle(int position) {
    return CONTENT[position % CONTENT.length];
}
}

リストフラグメント

public class MyListFragment extends SherlockListFragment {
public static final String NAME_TAG = "name";
public static final String DESCRIPTION_TAG = "description";
private static int dow;
public static final String TAG = "listFragment";
// Keys used in Hashmap that will be mapped to the rows
String[] dFrom = { NAME_TAG, DESCRIPTION_TAG };
private ArrayList<HashMap<String, String>> list;
int[] dTo = { R.id.name, R.id.description };
    public void upDateList() {
    //**************************Not really sure if this is how things are supposed 
            //** to be done. For my small data- set i feel like it will work but i would 
            //** be interested in knowing how else this might be done. 
              ListFragmentDisplay lFD = (ListFragmentDisplay) this
            .getParentFragment();
        dList = lFD.getList(dow);
}
public static MyListFragment newInstance(int pos) {
    MyListFragment frag = new MyListFragment();
    dow = pos;
    return (frag);
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    upDateList();
    View results = inflater.inflate(R.layout.list_fragment, container,
            false);
    SimpleAdapter adapter = new SimpleAdapter(getParentFragment()
            .getActivity(), list, R.layout.listrow, dFrom, dTo);
    setListAdapter(adapter);
    return results;
}
}

編集。解決されたコード: In List Fragment 最初の質問は解決されました。私は、ListFragmentDisplay への onPostExecute コールバックを実装する過程にあるだけです。私の非常に初心者の間違いを解決してくれた Luksprog に感謝します。その影響を知らずにダウを静的にしました。それは実際には、競合を解決するために Eclipse が提供したものだったと思います。もっと詳しく読むべきだった。

 public class MyListFragment extends SherlockListFragment {
public static final String NAME_TAG = "name";
public static final String DESCRIPTION_TAG = "description";

public static final String TAG = "listFragment";
// Keys used in Hashmap that will be mapped to the rows
String[] dFrom = { NAME_TAG, DESCRIPTION_TAG };
private ArrayList<HashMap<String, String>> list;
int[] dTo = { R.id.name, R.id.description };

    SimpleAdapter adapter = null; **NEW**
    
    public void upDateList() {
                      ListFragmentDisplay lFD = (ListFragmentDisplay) this
            .getParentFragment();
        dList = lFD.getList(getArguments().getInt(TAG)); **NEW**
            if(adapter != null)  **NEW**
            adapter.notifyDataSetChanged(); **NEW**
}
public static MyListFragment newInstance(int pos) {
    MyListFragment frag = new MyListFragment();

    Bundle args = new Bundle(); **NEW**
    args.putInt(TAG, pos); **NEW**
    frag.setArguments(args); **NEW**

    return (frag);
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    upDateList();
    View results = inflater.inflate(R.layout.list_fragment, container,
            false);
    adapter = new SimpleAdapter(getParentFragment()
            .getActivity(), list, R.layout.listrow, dFrom, dTo);
    setListAdapter(adapter);
    return results;
}
}
4

1 に答える 1

1

asdowから変数を作成した理由はありますか? キーワードを使用すると、 からのフラグメントが位置を共有するため、ほとんどの場合、間違った位置でメソッドを呼び出すことになります。プライベートインスタンス フィールドを作成します。MyListFragmentstaticstaticViewPagerlFD.getList(dow);dowprivate int dow;

コードの残りの部分については問題ないようです。上記の変更で問題が解決するかどうかを確認してください。内部フラグメントのデータを更新するには、次のシナリオに従うことができます。

  • データの空のリストListFragmentDisplayから始めて、タスクを開始します
  • 最初は、内部ListFragmnentsでデータ リストが空であることがわかるため、空のリストで初期化します (フィールドgetList(int day)にデータがない場合、メソッドは空のリストを返すだけです)。listByDay
  • あなたの仕事は今終わります。onPostExecuteのメソッドからのコールバックがあるとしますAsyncTaskListFragmentDisplayが実装するそのコールバックでは、現在ユーザーに表示されているか、生きてFragmentいる状態にあるからすべてを更新します(そうでないものとそのメソッドがから返されないものが更新されます)。メソッドを呼び出す必要があり、そこに呼び出しがあるため、もう一方は自己更新します 。ViewPagerFragmentPagerAdapter FragmentnullgetView()nullViewPagerFragmentsonCreateViewupdateList
  • 上記の点については、updateListメソッドを呼び出しても可視が更新されないことに注意しFragmentてください。そのメソッドでは、アダプターで呼び出していないフラグメントのリストを更新しnotifyDataSetChangedて、データが変更されたことを通知するだけだからです。
于 2012-12-07T08:39:40.453 に答える