我在从SQL数据库填充TextView时遇到困难。我有一栏填充了一个微调框,然后我希望由微调框选择的同一行中的MySQL列填充这两个Textviews。
我找不到要添加到OnSelectedItem部分的正确代码。

MainActivity.java

public class MainActivity extends AppCompatActivity implements OnItemSelectedListener{

    Context c;
    TextView colorDensity;
    Spinner colorSpinner= findViewById(R.id.colorSpinner);

    ArrayList<String> colors=new ArrayList<>();

    final static String urlAddress = "http://www.burtkuntzhandjobs.org/dbcolors.php";

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Downloader(MainActivity.this,urlAddress,colorSpinner).execute();
        colorDensity = (TextView)findViewById(R.id.colorDensity);
        colorSpinner.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

    }



    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        Toast.makeText(this,"Select Color", Toast.LENGTH_SHORT).show();
    }
}


DataParser.java

public class DataParser extends AsyncTask<Void,Void,Integer> {

    Context c;
    Spinner colorSpinner;
    String jsonData;

    ProgressDialog pd;
    ArrayList<String> colors=new ArrayList<>();

    public DataParser(Context c, Spinner colorSpinner, String jsonData) {
        this.c = c;
        this.colorSpinner = colorSpinner;
        this.jsonData = jsonData;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        pd = new ProgressDialog(c);
        pd.setTitle("Parse");
        pd.setMessage("Parsing");
        pd.show();
    }

    @Override
    protected Integer doInBackground(Void...params) {
        return this.parseData();
    }

    @Override
    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);

        pd.dismiss();

        if(result == 0){
            Toast.makeText(c,"Unable to Parse",Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(c,"Parse Successful",Toast.LENGTH_SHORT).show();
            ArrayAdapter adapter = new ArrayAdapter(c,android.R.layout.simple_list_item_1,colors);
            colorSpinner.setAdapter(adapter);
        }
    }

    private int parseData() {
        try {
            JSONArray ja=new JSONArray(jsonData);
            JSONObject jo=null;
            colors.clear();
            Colors s=null;

            for (int i = 0; i < ja.length(); i++) {
                jo = ja.getJSONObject(i);

                int ui = jo.getInt("ui");
                String color=jo.getString("color");
                String density = jo.getString("density");
                String strainer = jo.getString("strainer");

                s = new Colors();
                s.setIu(ui);
                s.setColor(color);
                s.setDensity(density);
                s.setStrainer(strainer);

                colors.add(color);
            }
            return 3;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return 0;
    }
}


下载器

public class Downloader extends AsyncTask<Void,Void,String> {

    Context c;
    String urlAddress;
    Spinner colorSpinner;

    ProgressDialog pd;


    public Downloader(Context c, String urlAddress, Spinner colorSpinner) {
        this.c = c;
        this.urlAddress = urlAddress;
        this.colorSpinner = colorSpinner;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        pd = new ProgressDialog(c);
        pd.setTitle("Fetch");
        pd.setMessage("Fetching");
        pd.show();
    }

    @Override
    protected String doInBackground(Void...params) {
        return this.downloadData();
    }


    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        pd.dismiss();

        if(s == null) {
            Toast.makeText(c,"Unable to Retrieve",Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(c,"Success",Toast.LENGTH_SHORT).show();

            DataParser parser=new DataParser(c,colorSpinner,s);
            parser.execute();
        }
    }

    private String downloadData() {
        HttpURLConnection con= (HttpURLConnection) Connector.connect(urlAddress);
        if(con == null) {
            return null;
        }

        InputStream is = null;
        try {
            is = new BufferedInputStream(con.getInputStream());
            BufferedReader br=new BufferedReader(new InputStreamReader(is));

            String line = null;
            StringBuffer response=new StringBuffer();

            if(br != null){
                while ((line=br.readLine()) !=null) {
                    response.append(line+"\n");
                }
                br.close();

            } else {
                return null;
            }
            return response.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(is != null){
                try{
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return  null;
    }
}

最佳答案

进行以下更改并添加所需的代码,

1.从类变量中删除Spinner colorSpinner= findViewById(R.id.colorSpinner);

2.在onCreate`方法中添加Spinner colorSpinner= findViewById(R.id.colorSpinner);

看这根刺

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_spinner);
    Spinner colorSpinner= findViewById(R.id.colorSpinner);
    new Downloader(this, urlAddress,colorSpinner).execute();
    colorDensity = (TextView)findViewById(R.id.colorDensity);
    colorSpinner.setOnItemSelectedListener(this);
}


3.访问DataParser类的颜色列表,

public class DataParser extends AsyncTask<Void,Void,Integer> {
Context c;
Spinner colorSpinner;
String jsonData;

ProgressDialog pd;
ArrayList<String> colors=new ArrayList<>();
private static ArrayList<Colors> colorsList=new ArrayList<>(); // add this line

public DataParser(Context c, Spinner colorSpinner, String jsonData) {
    this.c = c;
    this.colorSpinner = colorSpinner;
    this.jsonData = jsonData;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();

    pd = new ProgressDialog(c);
    pd.setTitle("Parse");
    pd.setMessage("Parsing");
    pd.show();
}

@Override
protected Integer doInBackground(Void...params) {
    return this.parseData();
}

@Override
protected void onPostExecute(Integer result) {
    super.onPostExecute(result);

    pd.dismiss();

    if(result == 0){
        Toast.makeText(c,"Unable to Parse",Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(c,"Parse Successful",Toast.LENGTH_SHORT).show();
        ArrayAdapter adapter = new ArrayAdapter(c,android.R.layout.simple_list_item_1,colors);
        colorSpinner.setAdapter(adapter);
    }
}

private int parseData() {
    try {
        JSONArray ja=new JSONArray(jsonData);
        JSONObject jo=null;
        colors.clear();
        Colors s=null;

        for (int i = 0; i < ja.length(); i++) {
            jo = ja.getJSONObject(i);

            int ui = jo.getInt("ui");
            String color=jo.getString("color");
            String density = jo.getString("density");
            String strainer = jo.getString("strainer");

            s = new Colors();
            s.setUi(ui);
            s.setColor(color);
            s.setDensity(density);
            s.setStrainer(strainer);

            colors.add(color);
            colorsList.add(s); // add this line
        }
        return 3;
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return 0;
}

public static List<Colors> getColorsList() { // add this method
    return colorsList;
}
}


4.在活动类别的onItemSelected()方法中相应地设置密度。

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    List<Colors> colorsList = DataParser.getColorsList();
    colorDensity.setText(colorsList.get(position).getDensity());
}

07-25 22:19