2014-02-17 4 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

Самый простой способ связи между вашей деятельностью и вашей асинтезной задачей - создать один интерфейс, добавить нужные вам методы внутри, а затем внутри onPostExecute() вызвать их с помощью блока try/catch. В этой операции реализуйте интерфейс и переопределите методы (вместо использования setSOmeInterfaceListener). Это, надеюсь, поможет здесь. – Eenvincible

ответ

3

Быстрое исправление просто изменить эту линию

task.setOnArticleSelectedListener (это);

к

task.setOnArticleSelectedListener (Portfolio.this);


Объяснение:

Вы создан экземпляр определения встроенного в AdapterView.OnItemSelectedListener с линией

portfolioType.setOnItemSelectedListener (новый AdapterView.OnItemSelectedListener() {...}

так когда вы вызываете setOnArticleSelectedListener(), вы делаете это в рамках этого встроенного определения класса.Таким образом, «это» не понимается компилятором как текущий экземпляр Portfolio, а скорее как текущий экземпляр AdapterView.OnItemSelectedListener. Однако встроенное определение имеет доступ к окружению класса Portfolio и его членов. С помощью «Portfolio.this» вы сообщаете компилятору использовать текущий экземпляр этого охватывающего класса.

+0

только что осознал эту проблему, но я не могу использовать ее для других задач async: 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); 

в этой области, this относится к AdapterView.OnItemSelectedListener объекта, ш это не то, что ожидает ваша задача. Основываясь на вашем коде, похоже, что вы хотите, чтобы ваша задача перезвонила к фрагменту Portfolio, поскольку это тот, который реализует метод обратного вызова вашего интерфейса прослушивателя.

Таким образом, способ указать компилятор, что вы хотите this означают экземпляр Portfolio, чтобы написать это так:

task.setOnArticleSelectedListener(Portfolio.this); 

Теперь вы передаете правильный экземпляр объекта вашей задачу.

+0

изменил эту строку в OnArticleSelectedListened от setONItemSelectedLIstener и теперь я получаю: не удается разрешить метод «OnArticleSelectedListener (android.widget.AdapterView.OnItemSelectedListener) – Mike

+0

измените ваш вопрос, чтобы показать новый код –

+0

подступила – Mike

Смежные вопросы