为什么ArrayAdapter在此示例中始终为null?

时间:2015-04-20 09:55:42

标签: android multithreading android-arrayadapter android-listfragment

我的代码结构如下:

public class MyListFragment extends ListFragment {
    private ArrayList<User> users;

    private void initAdapter() {
        if(users == null) return;
        //getUserStatus(users); <———HERE 1
        UsersAdapter adapter = new UsersAdapter(users);
        setListAdapter(users);
        getUserStatus(users);   // vs <—— HERE 2
    }  

    private void getUserStatus(List<User> users) {
        final UsersAdapter  adapter = (UsersAdapter )getListAdapter();
                 for(User user:users) {
            Thread t = new Thread(new Runnable() {
                //code to fetch some data
                if ( adapter == null) Log.e(“App”, “Adapter is NULL!”);
            });
            t.start();
        }
    }

    private UsersAdapter extends ArrayAdapter<User> {
        public UsersAdapter(List<User> users) {
            super(getActivity(), 0, users);
        }

        @Override
                public View getView(int position, View convertView, ViewGroup parent) {
            //code to inflate and populate list item
        }       
    }   

我的问题是:
为什么在我的initAdapter中,如果我在标记为getUserStatus的当前版本中注释掉HERE 2并取消注释HERE 1,那么getUserStatus之前运行 / em> setListAdapter adapter始终null getUserStatus?我总是在日志中看到所有线程Adapter is NULL

1 个答案:

答案 0 :(得分:0)

很简单。在这里,你试图从你尚未初始化的适配器获取用户相关的东西,这是使用函数setListAdapters(用户)进行的。在HERE 2中,您在初始化适配器后获得用户,因此它工作正常。