Android加载程序没有加载内容

时间:2014-11-02 11:51:08

标签: android android-loadermanager android-loader

我试图实现一个加载器,它应该使用改造从restful api加载一些数据。但是,除非我在onOptionsItemSelected方法中调用workspaceAdapter.notifyDataSetChanged(),否则内容不会被加载。我打电话是因为我实际上不打电话。我觉得很奇怪。

关于这一点的第二个奇怪的事情是,如果我更改服务器上的某些数据并尝试通过单击刷新菜单项来更新,该菜单项应该调用相同的workspaceAdapter.notifyDataSetChanged(),没有任何反应。

以下是我的活动。

public class WorkspacesActivity extends Activity implements LoaderCallbacks<List<ListviewEntry>> {
    private static final String TAG = WorkspacesActivity.class.getSimpleName();
    private static final int LOADER_ID = 1;
    private RestClient client;
    private ProgressBar progressBar;
    private WorkspaceAdapter workspaceAdapter;
    private ListView listView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_workspaces);

        workspaceAdapter = new WorkspaceAdapter(this);

        listView = (ListView)findViewById(R.id.listView);
        listView.setAdapter(workspaceAdapter);

        progressBar = (ProgressBar)findViewById(R.id.workspacesProgressBar);
        progressBar.setVisibility(View.VISIBLE);

        Bundle extras = getIntent().getExtras();
        if(extras == null) {
            return;
        }

        String accessToken = extras.getString(MainActivity.INTENT_ACCESS_TOKEN);
        if(accessToken != null) {
            client = new RestClient(accessToken);
            getLoaderManager().initLoader(LOADER_ID, null, this);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId())
        {
            case R.id.action_refresh:
                workspaceAdapter.notifyDataSetChanged();
//                getLoaderManager().getLoader(LOADER_ID).forceLoad();
                return true;
            case R.id.action_create_organization:
                return true;
            case R.id.action_settings:
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public Loader<List<ListviewEntry>> onCreateLoader(int i, Bundle bundle) {
        Log.d(TAG, "onCreateLoader");
        progressBar.setVisibility(View.VISIBLE);
        return new WorkspaceLoader(this, client);
    }

    @Override
    public void onLoadFinished(Loader<List<ListviewEntry>> listLoader, List<ListviewEntry> listviewEntries) {
        Log.d(TAG, "onLoadFinished");
        progressBar.setVisibility(View.GONE);
        workspaceAdapter.setData(listviewEntries);
    }

    @Override
    public void onLoaderReset(Loader<List<ListviewEntry>> listLoader) {
        Log.d(TAG, "onLoaderReset");
        progressBar.setVisibility(View.VISIBLE);
        workspaceAdapter.setData(null);
    }
}

我的装载机。

public class WorkspaceLoader extends AsyncTaskLoader<List<ListviewEntry>> {
    private static final String TAG = WorkspaceLoader.class.getSimpleName();

    private RestClient client;

    public WorkspaceLoader(Context context, RestClient client) {
        super(context);
        this.client = client;
    }

    @Override
    public void onStartLoading() {
        Log.d(TAG, "onStartLoading");
        forceLoad();
        super.onStartLoading();
    }

    /**
     * Since Organization has (1:m) Workspaces. We need to flatten this structure. A
     * List<ListviewEntry> is used as internal data source. So this method request all the
     * oganizations associated with a user, extracts organization or workspace id, organization or
     * workspace name and stores those with a type indicating weather it's one or the other. This
     * list structure can then be passed on to the adapter.
     *
     * @return listviewEntries
     */
    @Override
    public List<ListviewEntry> loadInBackground() {
        Log.d(TAG, "loadInBackground");
        List<Organization> organizations = client.requestOrganizations();
        List<ListviewEntry> listviewEntries = new ArrayList<ListviewEntry>();
        // Flatten Organizations and Workspaces
        for (Organization organization : organizations) {
            listviewEntries.add(new ListviewEntry(organization.getOrg_id(), organization.getName(),
                    ListviewEntry.Type.ORGANIZATION));
            for (Workspace workspace : organization.getSpaces()) {
                listviewEntries.add(new ListviewEntry(workspace.getSpace_id(), workspace.getName(),
                        ListviewEntry.Type.WORKSPACE));
            }
        }
        return listviewEntries;
    }

    @Override
    public void deliverResult(List<ListviewEntry> data) {
        Log.d(TAG, "deliverResult");
        if(isReset())
        {
            if(data != null) {
                releaseResources(data);
                return;
            }
        }
        super.deliverResult(data);
    }

    private void releaseResources(List<ListviewEntry> data) {
        Log.d(TAG, "releaseResources");
        // For a simple List, there is nothing to do. For something like a Cursor,
        // we would close it in this method. All resources associated with the
        // Loader should be released here.
    }
}

我的适配器。

public class WorkspaceAdapter extends BaseAdapter {
    private static final String TAG = WorkspaceAdapter.class.getSimpleName();
    private List<ListviewEntry> data;
    private LayoutInflater layoutInflater;

    public WorkspaceAdapter(Context context) {
        data = new ArrayList<ListviewEntry>();
        layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void setData(List<ListviewEntry> data) {
        this.data = data;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public ListviewEntry getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            switch (getItem(position).getType()) {
                case WORKSPACE:
                    convertView = layoutInflater.inflate(R.layout.listview_workspace, null);
                    holder.textView = (TextView) convertView.findViewById(R.id.listViewRow);
                    break;
                case ORGANIZATION:
                    convertView = layoutInflater.inflate(R.layout.listview_organization, null);
                    holder.textView = (TextView) convertView.findViewById(R.id.listViewHeader);
                    break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.textView.setText(data.get(position).getName());

        return convertView;
    }

    public static class ViewHolder {
        public TextView textView;
    }

}

任何人都知道我哪里出错了?

1 个答案:

答案 0 :(得分:0)

我在我的适配器上调用了notifyDataSetChanged更新了我的setData方法。例如

public void setData(List<ListviewEntry> data)
{
    this.data = data;
    notifyDataSetChanged();
}

这似乎可以解决问题。但这应该怎么做?