Я начал изучать разработку Android несколько дней назад. Я пытаюсь получить данные из REST API, и я использую класс AsyncTask для выполнения транзакции HTTP. Проблема в том, что я не могу получить контекст для своего основного действия, чтобы найти свой ListView и назначить ему его содержимое в onPostExecute().Контекст не может быть разрешен для типа
Вот MainActivity.java:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new DownloadMediaList(this).execute();
}
}
А вот DownloadMediaList.java:
public class DownloadMediaList extends AsyncTask<Void, Void, ArrayList<Media>> {
ListView listView = null;
Context mainContext = null;
public DownloadMediaList(Context main){
this.mainContext = main;
}
@Override
protected void onPreExecute(){
listView = (ListView) mainContext.this.findViewById(R.id.media_list);
}
// Operations that we do on a different thread.
@Override
protected ArrayList<Media> doInBackground(Void... params){
// Set an ArrayList to store the medias.
ArrayList<Media> mediaList = new ArrayList<Media>();
// Call the REST API and get the request info and media list in a JSONObject.
RESTFunctions restRequest = new RESTFunctions();
JSONObject jsonMedia = restRequest.getMediaList();
// Try catch to catch JSON exceptions.
try {
// Store the media list into a JSONArray.
JSONArray mediaArray = jsonMedia.getJSONArray("media");
// Create an instance of media to store every single media later.
Media media = new Media();
// Loop through the JSONArray and add each media to the ArrayList.
for (int i=0; i<mediaArray.length();i++){
media = new Media();
JSONObject singleMedia = mediaArray.getJSONObject(i);
media.setTitle(singleMedia.getString("titre"));
media.setYear(singleMedia.getString("annee"));
media.setLength(singleMedia.getString("duree"));
mediaList.add(media);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Return the ArrayList.
return mediaList;
}
// Operations we do on the User Interface. Synced with the User Interface.
@Override
protected void onPostExecute(ArrayList<Media> mediaList){
// Set TextViews in ListViews here
}
}
Эти классы находятся в двух отдельных файлах.
Эта линия, в частности, дает мне неприятность:
listView = (ListView) mainContext.this.findViewById(R.id.media_list);
Что я делаю неправильно? Он сообщает мне, что контекст не может быть разрешен для типа, хотя я импортировал android.content.Context. Я попытался создать экземпляр контекста, но я тоже не могу этого сделать.
Кажется, вам не нужен «mainContext.this» Вы пробовали просто (активность) mainContext? Собственно, сам контекст не имеет метода findViewById(). – sandrstar
Whelp, похоже, что я неправильно прочитал и включил контекст вместо Activity. Но разве это не заставило бы мою деятельность просачиваться в другой класс? – Sefam
Я основываюсь на последнем ответе здесь: http://stackoverflow.com/questions/4979454/the-method-findviewbyidint-is-undefined. В этом случае, что мне делать? – Sefam