Полу-нов в програмирането на приложения за Android или приложения като цяло. Опитвам се да създам куп бутони въз основа на JSON отговор. Отговорът се връща добре (проверено в Log.i) и няма грешки, показващи проблем, но бутоните не се показват. Ето моята основна дейност, клас asynctask и основен xml. Всяка обратна връзка е супер ценена.
Основна дейност:
public class MainActivity extends ActionBarActivity {
Spinner spinner;
public SpinAdapter adapter;
JSONObject jsonobject;
JSONArray jsonarray;
ProgressDialog mProgressDialog;
ArrayList<String> barlist;
Brewery[] breweries;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (Spinner) findViewById(R.id.planets_spinner);
Log.i("msg", "sent to json");
new DownloadJSON().execute();
Log.i("msg", "past to json");
}
private class DownloadJSON extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... params) {
barlist = new ArrayList<String>();
try
{
Log.i("msg", "inside try");
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpGet request = new HttpGet("http://fltapmap.com/populate.php");
HttpResponse response = httpclient.execute(request);
HttpEntity resEntity = response.getEntity();
String _response=EntityUtils.toString(resEntity);
jsonobject = new JSONObject(_response);
jsonarray = jsonobject.getJSONArray("breweries");
Log.i("msg", "breweries lengths: "+jsonarray.length());
breweries = new Brewery[jsonarray.length()];
for (int i = 0; i < jsonarray.length(); i++) {
jsonobject = jsonarray.getJSONObject(i);
breweries[i] = new Brewery();
breweries[i].setId(jsonobject.optInt("ID"));
breweries[i].setName(jsonobject.optString("brewery"));
}
}catch(Exception e)
{
Log.i("msg",""+e.getMessage());
}
return null;
}
protected void onPostExecute(Void args) {
// Spinner adapter
adapter = new SpinAdapter(MainActivity.this,android.R.layout.simple_spinner_item,breweries);
spinner.setAdapter(adapter);
// You can create an anonymous listener to handle the event when is selected an spinner item
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
int position, long id) {
// Here you get the current item (a User object) that is selected by its position
Brewery brewery = adapter.getItem(position);
// Here you can do the action you want to...
Log.i("msg", "inside selected method"+String.valueOf(brewery.getId()));
new RetrieveBeersTask(MainActivity.this, findViewById(R.id.beer_list)).execute(String.valueOf(brewery.getId()));
/*
jsonarray = jsonobject.getJSONArray("ontap");
Log.i("msg", "breweries lengths: "+jsonarray.length());
Button beer_btns[] = new Button[jsonarray.length()];
Log.i("msg","buttons made");
for (int i = 0; i < jsonarray.length(); i++) {
Log.i("msg","in loop"+String.valueOf(i));
LinearLayout layout = (LinearLayout)findViewById(R.id.beer_list);
beer_btns[i] = new Button(MainActivity.this);
beer_btns[i].setText(jsonarray.getJSONObject(i).getString("beer"));
beer_btns[i].setGravity(Gravity.CENTER_HORIZONTAL);
beer_btns[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//add your code here
}
});
layout.addView(beer_btns[i]);
}
*/
}
@Override
public void onNothingSelected(AdapterView<?> adapter) { }
});
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@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.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Клас AsyncTask
public class RetrieveBeersTask extends AsyncTask<String, Void, ArrayList<String>> {
private Exception exception;
JSONObject jsonobject;
public JSONArray jsonarray;
public ArrayList<String> return_beers;
private Activity myMain;
private View myLayout;
public RetrieveBeersTask(Activity passedin, View mainLayout) {
this.myMain = passedin;
this.myLayout = mainLayout;
}
@Override
protected ArrayList<String> doInBackground(String... brewery) {
try {
Log.i("msg", "inside launcher: Brewery - "+brewery[0]);
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpGet request = new HttpGet("http://fltapmap.com/ontap.php?id="+brewery[0]);
HttpResponse response = httpclient.execute(request);
Log.i("msg","request back");
HttpEntity resEntity = response.getEntity();
String _response=EntityUtils.toString(resEntity);
/*
Log.i("msg","ssending request");
HttpResponse response = httpclient.execute(request);
Log.i("msg","request back");
HttpEntity resEntity = response.getEntity();
Log.i("msg","should have response");
String _response=EntityUtils.toString(resEntity);
Log.i("msg","got repsonse"+_response);
*/
jsonobject = new JSONObject(_response);
jsonarray = jsonobject.getJSONArray("ontap");
return_beers = new ArrayList<String>();
for (int i = 0; i < jsonarray.length(); i++) {
Log.i("msg", "beer name: "+jsonarray.getJSONObject(i).getString("beer"));
return_beers.add(jsonarray.getJSONObject(i).getString("beer"));
}
return return_beers;
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
protected void onPostExecute(ArrayList<String> beers) {
// TODO: check this.exception
// TODO: do something with the feed
Log.i("msg", "length of array: "+String.valueOf(beers.size()));
Button beer_btns[] = new Button[jsonarray.length()];
for (int i = 0; i < beers.size(); i++) {
beer_btns[i] = new Button(myMain);
beer_btns[i].setText(beers.get(i));
beer_btns[i].setGravity(Gravity.CENTER_HORIZONTAL);
beer_btns[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//add your code here
}
});
LinearLayout layout = (LinearLayout)myLayout;
Log.i("msg",String.valueOf(layout));
layout.addView(beer_btns[i]);
}
}
}