ArrayList 值在调用 setAdapter 后消失了



我有一个显示网格视图的Android应用程序,有两个类,一个是GridActivity,另一个是GridActivityAdapter。我在AsyncTask方法中读取了一个json文件,并将json项添加到ArrayList中。问题是我需要在我的适配器中使用此 ArrayList 的数据,在设置适配器之前,此 ArrayList 的大小为 3,但在设置适配器之后,当我将其登录适配器构造函数时,大小为 0,并且我的 ArrayList 中的所有值都消失了!
这是我的网格活动
的代码

public class GridActivity extends Activity{
 public GridView gridView;
 public GridActivityAdaptor adaptorl
 public JsonObject[] jsonObjs;
 public ArrayList<String> urls = new ArrayList<String>();
 protected void onCreate(Bundle savedInstaceState){
 super.onCreate(savedInstanceState);
 setContentView(R.layout.grid_layout);
 new GetJson().execute();
 });
}
private class GetJson extends AsyncTask<Void,Void,Void>
{
 @Override
 protected Void doInBackground(Void... params){
 serviceHandler sh = new ServiceHandler();//handles all http connection parts
 String jsonStr = sh.makeServiceCall(jsonUrl;ServiceHandler.Get);//gets the json data
 if(jsonStr!=null)
 {
  try{
   JSONObject jsonObj = new JSONObject(jsonStr);
   JSONArray jsons = jsonObj.getJSONArray("items");
   jsonObjs = new JSONObject[jsons.length()];
   for(int i=0;i<jsons.length();i++)
   {
    jsonObjs = jsons.getJSONObject(i);
    urls.add(jsonObjs[i].getString("url"));
   }
  }
  catch(JSONException e){
   e.printStackTrace();
  }
 }
 return null;
}
@Override
protected void onPostExecute(Void result){
 super.onPostExecute(result);
 Log.d("appname","urls.size()" + urls.size()); //returns 3 here
 gridView.setAdapter(new GridActivityAdapter(GridActivity.this));
}
}
}

这是GridActivityAdapter的代码:

public class GridActivityAdapter extends BaseAdapter{
 public GridActivity gridActivity;
 public GridActivity(Context c){
  gridActivity = new GridActivity();
  Log.d("appname","urls size: " + gridActivity.urls.size()); //returns 0
 }
 ...
 ...
 ...
 ...
}

urls.size(( 当我在 setAdapter 之前记录时返回 3,但在它之后和 GridActivityAdapter 的构造函数中,相同的日志返回 0,我不能再使用我的 ArrayList。
如果有人可以帮助我,我将不胜感激。

试试这个:

在适配器中:

public GridActivity(Context c, ArrayList<String> urls){
  Log.d("appname","urls size: " + urls.size());
}

在您的活动中:

@Override
protected void onPostExecute(Void result){
 super.onPostExecute(result);
   Log.d("appname","urls.size()" + urls.size()); 
   gridView.setAdapter(new GridActivityAdapter(GridActivity.this, urls));
}

最新更新