2014-02-17 21 views
0

我在這條線在這裏得到一個錯誤使用的接口:收到錯誤試圖在一個異步任務

task.setOnArticleSelectedListener(this); 

我得到的錯誤是:

setOnArticleSelectedListener 
(com.beerportfolio.beerportfoliopro.PortfolioGetAllBeers.OnArticleSelectedListener) 
in PortfolioGetAllBeers cannot be applied 
to 
(android.widget.AdapterView.OnItemSelectedListener) 

該代碼出來的:

public class Portfolio extends Fragment implements PortfolioGetAllBeers.OnArticleSelectedListener { 

    String beerId = ""; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     //set layout here 
     final View theLayout = inflater.inflate(R.layout.activity_portfolio, container, false); 
     setHasOptionsMenu(true); 
     getActivity().setTitle("Style"); 

     //get user information 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     String userName = prefs.getString("userName", null); 
     String userID = prefs.getString("userID", null); 

     final Spinner portfolioType = (Spinner) theLayout.findViewById(R.id.portfolioSpinner); 
     portfolioType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 


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

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


       Log.d("portfolio", portfolioChoice); 

       if(portfolioChoice.equals("All")){ 


        //todo: clear second spinner 
        LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout); 
        ll.removeAllViews(); 

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

        //construct url 
        String url = "myURL"; 


        //async task goes here 
        PortfolioGetAllBeers task = new PortfolioGetAllBeers(getActivity()); 
        task.setOnArticleSelectedListener(this); 
        task.execute(url); 

       } 

       else if (portfolioChoice.equals("Brewery")){ 

        LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout); 
        ll.removeAllViews(); 
        LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE); 
        View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner 
        Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2 
        ll.addView(v); // add the view to the linear layout 

        //todo: get breweries and fill spinner 
        //get userID 
        //get user data 
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext()); 
        String userID = prefs.getString("userID", null); 

        //construct url 
        String url = "myURL2"; 


        //async task goes here 
        new PortfolioGetAllBreweries(selectedItemView.getContext()).execute(url); 

       } 


       else if (portfolioChoice.equals("Style")){ 

        LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout); 
        ll.removeAllViews(); 
        LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE); 
        View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner 
        Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2 
        ll.addView(v); // add the view to the linear layout 

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

        //construct url 
        String url = "http://beerportfolio.com/app_getAllYourStyles.php?u=" + userID; 


        //todo: async task goes here 

        new PortfolioGetAllStyles(selectedItemView.getContext()).execute(url); 

       } 

       else if (portfolioChoice.equals("Rating")){ 

        LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout); 
        ll.removeAllViews(); 
        LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE); 
        View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner 
        Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2 
        ll.addView(v); // add the view to the linear layout 

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

        //make array 

        //make array list for beer 
        final List<String> tasteList = new ArrayList<String>(); 
        tasteList.add("1"); 
        tasteList.add("2"); 
        tasteList.add("3"); 
        tasteList.add("4"); 
        tasteList.add("5"); 

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

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



        //todo: add on select for spinner 2 
//add on item selected 
        final Spinner portfolioType = (Spinner) theLayout.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(); 
          final ListView lv = (ListView) theLayout.findViewById(R.id.allYourBeersList); 
          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 = "myURL3"; 

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

         } 



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

        }); 




       } 

      } 

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

     }); 






     // Inflate the layout for this fragment 
     return theLayout; 

    } 

    @Override 
    public void onArticleSelected(String bID, String brewery){ 

     //code to execute on click 
     Fragment Fragment_one; 
     FragmentManager man= getFragmentManager(); 
     FragmentTransaction tran = man.beginTransaction(); 
     Fragment_one = new BeerPage(); 
     final Bundle bundle = new Bundle(); 
     bundle.putString("beerIDSent", bID); 
     bundle.putString("breweryIDSent", brewery); 
     Fragment_one.setArguments(bundle); 
     tran.replace(R.id.main, Fragment_one);//tran. 
     tran.addToBackStack(null); 
     tran.commit(); 

    } 

} 

然後異步任務的代碼是:

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

    Context c; 
    private ProgressDialog Dialog; 

    public PortfolioGetAllBeers (Context context) 
    { 
     c = context; 
     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 beers"); 

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

    //***************************code for on click 
    OnArticleSelectedListener listener; 
    public interface OnArticleSelectedListener{ 
     public void onArticleSelected(String myString , String brewery); 

    } 
    public void setOnArticleSelectedListener(OnArticleSelectedListener listener){ 
     this.listener = listener; 


    } 
    //*****************************end code for onClick 

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


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

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



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

       String beer = jsonArray.getJSONObject(i).getString("beer"); 
       String rate = jsonArray.getJSONObject(i).getString("rate"); 
       String beerID = jsonArray.getJSONObject(i).getString("id"); 
       String bID = jsonArray.getJSONObject(i).getString("breweryID"); 


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

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


      //add items to listview 
      ShortBeerInfoAdapter adapter1 = new ShortBeerInfoAdapter(c ,R.layout.brewer_stats_listview, tasteList); 
      lv.setAdapter(adapter1); 

      //set up clicks 
      lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> arg0, View arg1, 
             int arg2, long arg3) { 
        ShortBeerInfo o=(ShortBeerInfo)arg0.getItemAtPosition(arg2); 

        String tempID = o.id; 
        String tempBrewID = o.brewery; 


        //todo: go to beer page 
        listener.onArticleSelected(tempID, tempBrewID); 


       } 
      }); 

     } 
     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(); 
    } 

} 

更新的代碼:

public class Portfolio extends Fragment implements PortfolioGetAllBeers.OnArticleSelectedListener { 

    String beerId = ""; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     //set layout here 
     final View theLayout = inflater.inflate(R.layout.activity_portfolio, container, false); 
     setHasOptionsMenu(true); 
     getActivity().setTitle("Style"); 

     //get user information 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     String userName = prefs.getString("userName", null); 
     String userID = prefs.getString("userID", null); 

     final Spinner portfolioType = (Spinner) theLayout.findViewById(R.id.portfolioSpinner); 
     portfolioType.OnArticleSelectedListener(new AdapterView.OnItemSelectedListener() { 


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

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


       Log.d("portfolio", portfolioChoice); 

       if(portfolioChoice.equals("All")){ 


        //todo: clear second spinner 
        LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout); 
        ll.removeAllViews(); 

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

        //construct url 
        String url = "myURL"; 


        //async task goes here 
        PortfolioGetAllBeers task = new PortfolioGetAllBeers(getActivity()); 
        task.setOnArticleSelectedListener(this); 
        task.execute(url); 

       } 

       else if (portfolioChoice.equals("Brewery")){ 

        LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout); 
        ll.removeAllViews(); 
        LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE); 
        View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner 
        Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2 
        ll.addView(v); // add the view to the linear layout 

        //todo: get breweries and fill spinner 
        //get userID 
        //get user data 
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext()); 
        String userID = prefs.getString("userID", null); 

        //construct url 
        String url = "myURL"; 


        //async task goes here 
        new PortfolioGetAllBreweries(selectedItemView.getContext()).execute(url); 

       } 


       else if (portfolioChoice.equals("Style")){ 

        LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout); 
        ll.removeAllViews(); 
        LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE); 
        View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner 
        Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2 
        ll.addView(v); // add the view to the linear layout 

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

        //construct url 
        String url = "http://beerportfolio.com/app_getAllYourStyles.php?u=" + userID; 


        //todo: async task goes here 

        new PortfolioGetAllStyles(selectedItemView.getContext()).execute(url); 

       } 

       else if (portfolioChoice.equals("Rating")){ 

        LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout); 
        ll.removeAllViews(); 
        LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE); 
        View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner 
        Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2 
        ll.addView(v); // add the view to the linear layout 

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

        //make array 

        //make array list for beer 
        final List<String> tasteList = new ArrayList<String>(); 
        tasteList.add("1"); 
        tasteList.add("2"); 
        tasteList.add("3"); 
        tasteList.add("4"); 
        tasteList.add("5"); 

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

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



        //todo: add on select for spinner 2 
//add on item selected 
        final Spinner portfolioType = (Spinner) theLayout.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(); 
          final ListView lv = (ListView) theLayout.findViewById(R.id.allYourBeersList); 
          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 = "myURL2"; 

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

         } 



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

        }); 




       } 

      } 

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

     }); 






     // Inflate the layout for this fragment 
     return theLayout; 

    } 

    @Override 
    public void onArticleSelected(String bID, String brewery){ 

     //code to execute on click 
     Fragment Fragment_one; 
     FragmentManager man= getFragmentManager(); 
     FragmentTransaction tran = man.beginTransaction(); 
     Fragment_one = new BeerPage(); 
     final Bundle bundle = new Bundle(); 
     bundle.putString("beerIDSent", bID); 
     bundle.putString("breweryIDSent", brewery); 
     Fragment_one.setArguments(bundle); 
     tran.replace(R.id.main, Fragment_one);//tran. 
     tran.addToBackStack(null); 
     tran.commit(); 

    } 

} 
+0

您的活動和的AsyncTask之間通信的最簡單的方法是創建一個接口,添加你需要它裏面的方法,然後裏面onPostExecute(),使用try/catch塊給他們打電話。在活動中,實現接口並覆蓋方法(而不是使用setSOmeInterfaceListener)。這將有助於在這裏。 – Eenvincible

回答

3

快速修復是簡單地改變這一行

task.setOnArticleSelectedListener(本);

task.setOnArticleSelectedListener(Portfolio.this);


說明:

您實例化的AdapterView.OnItemSelectedListener的內嵌定義與線

portfolioType.setOnItemSelectedListener(新AdapterView.OnItemSelectedListener(){...}

所以當你調用setOnArticleSelectedListener()時,你正在使用這個內聯類定義。因此,'this'不被編譯器理解爲Portfolio的當前實例,而是作爲AdapterView.OnItemSelectedListener的當前實例。但是,內聯定義可以訪問Portfolio類及其成員。通過使用'Portfolio.this',你可以告訴編譯器使用這個封閉類的當前實例。

+0

剛剛意識到這個固定的一個問題,但我不能用這個其他異步任務:http://stackoverflow.com/questions/22155201/using-an-interface-from-multiple-async-tasks – Mike

0

你實現PortfolioGetAllBeers任務的有一個方法setOnArticleSelectedListener()這需要一個OnArticleSelectedListener實例作爲參數。

Howerver,該行正在生成的錯誤,你傳遞AdapterView.OnItemSelectedListener類型的對象:

在這裏你要創建這種類型的偵聽行:

portfolioType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { ... 

那麼這裏面的範圍要調用:

PortfolioGetAllBeers task = new PortfolioGetAllBeers(getActivity()); 
task.setOnArticleSelectedListener(this); 

在此範圍內,thisAdapterView.OnItemSelectedListener對象,W這不是你的任務期望。根據你的代碼,它看起來像你希望你的任務回調到Portfolio片段,因爲它是實現你的監聽器接口的回調方法。

所以順便來指示要this意味着該Portfolio實例是把它寫這樣的編譯器:

task.setOnArticleSelectedListener(Portfolio.this); 

現在你傳遞了正確的對象實例的任務。

+0

改變該行OnArticleSelectedListened從setONItemSelectedLIstener,現在我得到: 無法解析法「OnArticleSelectedListener(android.widget.AdapterView.OnItemSelectedListener) – Mike

+0

請編輯您的問題以顯示新的代碼 –

+0

馬上就來 – Mike