Не удается разрешить конструктор в ArrayAdapter с использованием данных API - PullRequest
0 голосов
/ 29 июня 2018

Для школьного проекта мы создаем приложение на основе API, и теперь нам нужно получить данные из URL-адреса и добавить их в Spinner (Dropdown). Все работает (я думаю, даже не проверял) при получении данных, но вставка данных с использованием ArrayAdapter доставляет мне головную боль.

Ниже мой класс FetchData:

package com.example.prege.randomklasgenerator;

import android.app.Activity;
import android.os.AsyncTask;
import android.widget.ArrayAdapter;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONObject;


private String data = "";
private ArrayList<String> klaslist = new ArrayList<>();

@Override
protected Void doInBackground(Void... voids) {
    try {
        URL url = new URL("http://mgroesink-001-site12.itempurl.com/api/student?studentclass=" + MainActivity.etKlas.getSelectedItem().toString());
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        String jsonstring = bufferedReader.readLine();
        if(jsonstring != null) {
            try {
                JSONArray klassen = new JSONArray(jsonstring);

                for(int i = 0; i < klassen.length(); i++) {
                    String klasnaam = klassen.getString(i);

                    klaslist.add(klasnaam);
                }

                jsonstring = "";
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

protected void onPostExecute(Void aVoid) {
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(, android.R.layout.simple_spinner_item, klaslist);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    MainActivity.etKlas.setAdapter(dataAdapter);
}
}

В onPostExecute я пытаюсь создать ArrayAdapter, но он продолжает давать мне ошибки в параметре, где мне нужно указать его Context.

Ответы [ 4 ]

0 голосов
/ 29 июня 2018
**Try to change this method**

protected void onPostExecute(Void aVoid) {
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this.context, android.R.layout.simple_spinner_item, klaslist);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        MainActivity.etKlas.setAdapter(dataAdapter);
    }
0 голосов
/ 29 июня 2018

Добавьте ваш classname.this просто добавьте этот параметр

protected void onPostExecute(Void aVoid) {
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(FetchData.this, android.R.layout.simple_spinner_item, klaslist);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    MainActivity.etKlas.setAdapter(dataAdapter);
}
0 голосов
/ 29 июня 2018
package com.example.prege.randomklasgenerator;

import android.app.Activity;
import android.os.AsyncTask;
import android.widget.ArrayAdapter;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONObject;


private String data = "";
private ArrayList<String> klaslist = new ArrayList<>();

//Make a constructor here - let name of class is MyClass

Context context;

public Myclass(Context context)
{
    this.context = context;
}


@Override
protected Void doInBackground(Void... voids) {
    try {
        URL url = new URL("http://mgroesink-001-site12.itempurl.com/api/student?studentclass=" + MainActivity.etKlas.getSelectedItem().toString());
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        String jsonstring = bufferedReader.readLine();
        if(jsonstring != null) {
            try {
                JSONArray klassen = new JSONArray(jsonstring);

                for(int i = 0; i < klassen.length(); i++) {
                    String klasnaam = klassen.getString(i);

                    klaslist.add(klasnaam);
                }

                jsonstring = "";
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

protected void onPostExecute(Void aVoid) {
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, klaslist);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    MainActivity.etKlas.setAdapter(dataAdapter);
}
}

И при выполнении этого класса сделайте так: -

Myclass my = new Myclass(this);
my.execute();

Это определенно должно работать для вас.

0 голосов
/ 29 июня 2018

Ты просто скучаешь this. У вас там запятая, но перед ней ничего нет.

protected void onPostExecute(Void aVoid) {
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(ClassName.this, android.R.layout.simple_spinner_item, klaslist);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    MainActivity.etKlas.setAdapter(dataAdapter);
}

Надеюсь, теперь это сработает.

...