0

我有一个包含三个片段的主要活动。在第一个片段中是一个列表视图。我在片段的 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() 方法中刷新列表视图,但我无法让它工作。我尝试了这两种方法(如果我使用第一种方法,没有任何反应。如果我使用第二种方法,应用程序崩溃,返回 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 回答