0

私は 3 つのフラグメントを持つメイン アクティビティを持っています。最初のフラグメントはリストビューです。次のように、フラグメントの onCreateView メソッドに入力します。

private ArrayList<MobileNETDistinctChatInfo> m_parts = new ArrayList<MobileNETDistinctChatInfo>();
public MobileNETDistinctChatInfoAdapter m_adapter;
public ListView list;
public String logged_user;

onCreateView(){
    LinearLayout view = (LinearLayout) inflater.inflate(R.layout.tab1, container, false);
    list = (ListView)view.findViewById(R.id.chats_list)

    m_parts = db.MESSAGES_getAllDistinctChatInfo(logged_user); 

    // adapter extends the ArrayAdapter 
    m_adapter = new MobileNETDistinctChatInfoAdapter(getActivity(), R.layout.chatlist_list_item, m_parts);

    list.setAdapter(m_adapter);

    return view;

}

fragment1 の onResume() メソッドでリストビューを更新したいのですが、うまくいきません。次の 2 つの方法を試しました (最初の方法を使用すると、何も起こりません。2 番目の方法を使用すると、アプリがクラッシュし、NullPointerException が返されます)。

# 1
public void onResume() {
    super.onResume();

    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            m_adapter.notifyDataSetChanged();
        }
    }
}

# 2
public void onResume() {
    super.onResume();

    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {

            m_parts.clear();
            m_parts = db.MESSAGES_getAllDistinctChatInfo(logged_user);

            ListView list = (ListView) getActivity().findViewById(R.id.chats_list);
            MobileNETDistinctChatInfoAdapter caa = (MobileNETDistinctChatInfoAdapter) list.getAdapter();
            caa.clear();

            for(MobileNETDistinctChatInfo el : m_parts){
                caa.add(el);
            }

            list.setAdapter(caa);
        }
    }
}

OnResume() で m_parts と m_adapter のサイズを出力しましたが、アダプターが更新されていないようですが、m_parts は更新されています。理由、またはこれを解決する方法を知っている人はいますか?

4

1 に答える 1

0

リストが実際に変更または更新される前に、リストの更新を実行m_adapter.notifyDataSetChanged()する別のスレッドで実行しています。

コードをデベグすると、スレッドが実行されるのに十分な時間が得られたため、コードが正常に機能していることがわかります。

于 2013-09-25T11:28:24.013 に答える