бутон addView от клас AsyncTask, няма грешка, но бутонът не се показва

Полу-нов в програмирането на приложения за 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]);
        }
    }
}

person Chris Flannagan    schedule 05.09.2014    source източник
comment
вашият myLayout в потребителския ви интерфейс ли е?   -  person KOTIOS    schedule 05.09.2014
comment
Добавя ли се някъде препратка към „оформление“ в метода onPostExecute на класа AsyncTask?   -  person DmitryKanunnikoff    schedule 05.09.2014
comment
В изгледа, който се добавя, проверете дали извиквате неговия метод setLayoutParameter с подходящ ViewGroup.LayoutParameter.от този отговор   -  person Chiara Hsieh    schedule 05.09.2014
comment
сигурни ли сте, че имате отговор от сървъра?   -  person Rod_Algonquin    schedule 05.09.2014
comment
Така че накарах изгледите за показване, като ги промених на относително оформление вместо линейно оформление... Не разбирам защо това проработи. Както и да е, сега показва бутоните, но всички те са подредени един върху друг.   -  person Chris Flannagan    schedule 05.09.2014