2014-11-02 78 views
0

我试图实现一个装载程序,它应该使用翻新来加载来自restful api的一些数据。然而,内容不会被加载......除非我在我的onOptionsItemSelected方法中调用了workspaceAdapter.notifyDataSetChanged()。我说打电话是因为我实际上并不需要打电话。我觉得很奇怪。Android loader未加载内容

第二件奇怪的事情是,如果我更改服务器上的某些数据并尝试通过单击刷新菜单项应该调用相同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; 
    } 

} 

任何人都知道我要去哪里错了吗?

回答

0

我已更新我的适配器si调用notifyDataSetChanged我的setData方法。例如。

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

这似乎是个伎俩。但是,它是如何做到的?