2014-03-27 56 views
0

我有一個異步任務,用數據填充微調器。微調器數據來自列表中的對象。我的問題是,當我設置的onclick偵聽器列表中的項目我也想從對象不只是名字的ID:帶對象的Android微調器

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

    Context c; 
    PortfolioGetAllBeers.OnArticleSelectedListener useThis; 

    private ProgressDialog Dialog; 

    public PortfolioGetAllLists (Context context, PortfolioGetAllBeers.OnArticleSelectedListener thisListener) 
    { 
     c = context; 
     useThis = thisListener; 
     Dialog = new ProgressDialog(c); 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     return readJSONFeed(arg0[0]); 
    } 

    protected void onPreExecute() { 
     Dialog.setMessage("Getting Brewery List"); 

     Dialog.setTitle("Loading"); 
     Dialog.setCancelable(false); 
     Dialog.show(); 
    } 

    protected void onPostExecute(String result){ 
     //decode json here 
     try{ 
      JSONArray jsonArray = new JSONArray(result); 


      //acces listview 
      final ListView lv = (ListView) ((Activity) c).findViewById(R.id.allYourBeersList); 

      //make array list for beer 
      final List<String> tasteList = new ArrayList<String>(); 


      tasteList.add(""); 
      for(int i = 0; i < jsonArray.length(); i++) { 

       String bID = jsonArray.getJSONObject(i).getString("id"); 

       String beer = jsonArray.getJSONObject(i).getString("name"); 
       String rate = "na"; 
       String beerID = "na"; 


       //create object 
       ShortBeerInfo tempTaste = new ShortBeerInfo(beer, rate, beerID, bID); 

       //add to arraylist 
       tasteList.add(beer); 
      } 


      // Selection of the spinner 
      Spinner spinner = (Spinner) ((Activity) c).findViewById(R.id.portfolioSpinner2); 

      // Application of the Array to the Spinner 
      ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(c, android.R.layout.simple_spinner_item,tasteList); 
      spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view 
      spinner.setAdapter(spinnerArrayAdapter); 

      //add on item selected 
      final Spinner portfolioType = (Spinner) ((Activity) c).findViewById(R.id.portfolioSpinner2); 
      portfolioType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 


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

        String portfolioChoice = portfolioType.getSelectedItem().toString(); 

        //Toast.makeText(((Activity) c).getApplicationContext(), portfolioChoice, Toast.LENGTH_LONG).show(); 

        lv.setAdapter(null); 

        //get brewery beers 
        //get userID 
        //get user data 
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext()); 
        String userID = prefs.getString("userID", null); 



        try { 

         portfolioChoice = URLEncoder.encode(portfolioChoice, "UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
         e.printStackTrace(); 
        } 

        //construct url 
        String url = "myURL"; 

        Log.d("portfolio", url); 
        //async task goes here 
        //new PortfolioGetAllBeers(selectedItemView.getContext()).execute(url); 

        PortfolioGetAllBeers task = new PortfolioGetAllBeers(c); 
        task.setOnArticleSelectedListener(useThis); 
        task.execute(url); 

       } 



       @Override 
       public void onNothingSelected(AdapterView<?> parentView) { 
        // do nothing 
       } 

      }); 



     } 
     catch(Exception e){ 

     } 

     Dialog.dismiss(); 

    } 

    public String readJSONFeed(String URL) { 
     StringBuilder stringBuilder = new StringBuilder(); 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(URL); 
     try { 
      HttpResponse response = httpClient.execute(httpGet); 
      StatusLine statusLine = response.getStatusLine(); 
      int statusCode = statusLine.getStatusCode(); 
      if (statusCode == 200) { 
       HttpEntity entity = response.getEntity(); 
       InputStream inputStream = entity.getContent(); 
       BufferedReader reader = new BufferedReader(
         new InputStreamReader(inputStream)); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        stringBuilder.append(line); 
       } 
       inputStream.close(); 
      } else { 
       Log.d("JSON", "Failed to download file"); 
      } 
     } catch (Exception e) { 
      Log.d("readJSONFeed", e.getLocalizedMessage()); 
     } 
     return stringBuilder.toString(); 
    } 

} 

下面這條線是得到了啤酒的名字線,但我做的不知道如何從中設置列表視圖名稱的對象也得到了ID:

String portfolioChoice = portfolioType.getSelectedItem().toString(); 

Update:

我已經改變了我上面的代碼這包括自定義適配器:

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

    Context c; 
    PortfolioGetAllBeers.OnArticleSelectedListener useThis; 

    private ProgressDialog Dialog; 

    public PortfolioGetAllLists (Context context, PortfolioGetAllBeers.OnArticleSelectedListener thisListener) 
    { 
     c = context; 
     useThis = thisListener; 
     Dialog = new ProgressDialog(c); 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     return readJSONFeed(arg0[0]); 
    } 

    protected void onPreExecute() { 
     Dialog.setMessage("Getting Brewery List"); 

     Dialog.setTitle("Loading"); 
     Dialog.setCancelable(false); 
     Dialog.show(); 
    } 

    protected void onPostExecute(String result){ 
     //decode json here 
     try{ 
      JSONArray jsonArray = new JSONArray(result); 


      //acces listview 
      final ListView lv = (ListView) ((Activity) c).findViewById(R.id.allYourBeersList); 

      //make array list for beer 
      final List<ShortBeerInfo> tasteList = new ArrayList<ShortBeerInfo>(); 


      //tasteList.add(""); 
      for(int i = 0; i < jsonArray.length(); i++) { 

       String bID = jsonArray.getJSONObject(i).getString("id"); 

       String beer = jsonArray.getJSONObject(i).getString("name"); 
       String rate = "na"; 
       String beerID = "na"; 


       //create object 
       ShortBeerInfo tempTaste = new ShortBeerInfo(beer, rate, beerID, bID); 

       //add to arraylist 
       tasteList.add(tempTaste); 
      } 


      // Selection of the spinner 
      Spinner spinner = (Spinner) ((Activity) c).findViewById(R.id.portfolioSpinner2); 

      // Application of the Array to the Spinner 
      ShortBeerInfoAdapter<ShortBeerInfo> spinnerArrayAdapter = new ArrayAdapter<ShortBeerInfo>(c, android.R.layout.simple_spinner_item,tasteList); 
      spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view 
      spinner.setAdapter(spinnerArrayAdapter); 

      //add on item selected 
      final Spinner portfolioType = (Spinner) ((Activity) c).findViewById(R.id.portfolioSpinner2); 
      portfolioType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 


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

        String portfolioChoice = portfolioType.getSelectedItem().toString(); 


        //Toast.makeText(((Activity) c).getApplicationContext(), portfolioChoice, Toast.LENGTH_LONG).show(); 

        lv.setAdapter(null); 

        //get brewery beers 
        //get userID 
        //get user data 
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext()); 
        String userID = prefs.getString("userID", null); 



        try { 

         portfolioChoice = URLEncoder.encode(portfolioChoice, "UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
         e.printStackTrace(); 
        } 

        //construct url 
        String url = "myURL";  
        Log.d("portfolio", url); 
        //async task goes here 
        //new PortfolioGetAllBeers(selectedItemView.getContext()).execute(url); 

        PortfolioGetAllBeers task = new PortfolioGetAllBeers(c); 
        task.setOnArticleSelectedListener(useThis); 
        task.execute(url); 

       } 



       @Override 
       public void onNothingSelected(AdapterView<?> parentView) { 
        // do nothing 
       } 

      }); 



     } 
     catch(Exception e){ 

     } 

     Dialog.dismiss(); 

    } 

    public String readJSONFeed(String URL) { 
     StringBuilder stringBuilder = new StringBuilder(); 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(URL); 
     try { 
      HttpResponse response = httpClient.execute(httpGet); 
      StatusLine statusLine = response.getStatusLine(); 
      int statusCode = statusLine.getStatusCode(); 
      if (statusCode == 200) { 
       HttpEntity entity = response.getEntity(); 
       InputStream inputStream = entity.getContent(); 
       BufferedReader reader = new BufferedReader(
         new InputStreamReader(inputStream)); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        stringBuilder.append(line); 
       } 
       inputStream.close(); 
      } else { 
       Log.d("JSON", "Failed to download file"); 
      } 
     } catch (Exception e) { 
      Log.d("readJSONFeed", e.getLocalizedMessage()); 
     } 
     return stringBuilder.toString(); 
    } 

} 

,但在這條線:

ShortBeerInfoAdapter<ShortBeerInfo> spinnerArrayAdapter = new ArrayAdapter<ShortBeerInfo>(c, android.R.layout.simple_spinner_item,tasteList); 

我越來越shortbeerinfoadapter沒有類型參數

我的短啤酒信息適配器是:

public class ShortBeerInfoAdapter extends ArrayAdapter<ShortBeerInfo> { 

    Context context; 
    int layoutResourceId; 
    List<ShortBeerInfo> data = null; 

    public ShortBeerInfoAdapter(Context context, int layoutResourceId, List<ShortBeerInfo> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     beerHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new beerHolder(); 
      holder.txtBeer = (TextView)row.findViewById(R.id.breweryName); 
      holder.txtRate = (TextView)row.findViewById(R.id.breweryRate); 
      holder.txtBar = (RatingBar) row.findViewById(R.id.starbar); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (beerHolder)row.getTag(); 
     } 

     ShortBeerInfo beer = data.get(position); 
     holder.txtBeer.setText(beer.beer); 
     holder.txtRate.setText(beer.rate + " out of 5.00 Stars"); 

     holder.numHolder= Float.parseFloat(beer.rate); 

     holder.txtBar.setNumStars(5); 
     holder.txtBar.setRating(holder.numHolder); 

     return row; 
    } 

    static class beerHolder 
    { 
     TextView txtBeer; 
     TextView txtRate; 
     RatingBar txtBar; 
     Float numHolder; 
    } 
} 

回答

2

你有你的ShortBeerInfo ,其中包括名稱和ID。您將啤酒名稱添加到字符串列表中,然後從該列表創建ArrayAdapter。 ArrayAdapter只包含名稱。

要獲取ID,您需要一個類型爲ShortBeerInfo的自定義數組適配器。您需要在適配器中重寫OnCreateView,以便爲僅包含啤酒名稱的列表項創建View對象。 (或任何其他啤酒信息,你可能想要顯示)

然後在您的選擇監聽器getSelectedItem將返回一個ShortBeerInfo,其中包含所選啤酒的ID。

+0

我可以使用這個陣列適配器我用於別的東西嗎? https://gist.github.com/anonymous/74fccde80028718edbf8 – Mike

+0

是的,它看起來應該做的竅門 – Flynny75

+0

改變了它,但我仍然收到一些錯誤,我添加了新的代碼和我的適配器代碼,以我的上述問題更新。 – Mike