2012-09-22 12 views
20

Nazwałem metodę setAdapter() w klasie, która rozszerza Fragment. Zauważ, że zaimportowałem android.support.v4.app.Fragment.setAdapter "Połączenie wymaga poziomu interfejsu API 11 (bieżący min to 8): android.widget.AbsListView # setAdapter"?

jednak otrzymuję komunikat o błędzie informujący, że poziom API ma obowiązek być na poziomie 11.

Co muszę zrobić tak, że mogę to naprawić bez zmiany minSdkVersion="8" do minSdkVersion="11"

package foo.bar.qux; 

import java.util.Calendar; 
import java.util.Date; 

import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 

import android.support.v4.app.Fragment; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.TextView; 

public class TabFragmentList extends Fragment { 

    String category, xml; 
    NodeList nodes; 
    int numResults; 
    private ListView lv; 
    Date date; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     if (container == null) return null; 
     return (LinearLayout) inflater.inflate(R.layout.eventlist, container, 
       false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Activity activity = getActivity(); 
     if (activity != null) { 
      final Calendar c = Calendar.getInstance(); 
      ListContent[] item = new ListContent[3]; 
      category = (String) activity.getIntent().getExtras() 
        .get("category"); 
      xml = (String) activity.getIntent().getExtras().get("xml"); 
      TextView tv = (TextView) getView().findViewById(R.id.category); 
      tv.setText(category); 
      nodes = doc.getElementsByTagName("event"); 
      for (int i = 0; i < 3; i++) { 
       c.add(Calendar.DATE, 1); 
       date = c.getTime(); 
       item[i] = new ListContent(); 
       item[i].setList(nodes, category, date); 
      } 
      EventListAdapter adapter = new EventListAdapter(activity, 
        R.layout.eventlist_row, item); 
      lv = (ListView) getView().findViewById(R.id.listView1); 
      lv.setAdapter(adapter); // ERROR SHOWN HERE 
     } 
    } 
} 

Note : Próbowałem zmniejszyć wartość targetSdkVersion do 10. Jednak pojawia się błąd. Proszę pomóż!

Edycja: Nie rozumiem, dlaczego jest to określane jako AbsListVew, gdy wszystko, co użyłem, to ListView. Zwróć też uwagę, że użyłem niestandardowego adaptera.

EventListAdapter rozszerza ArrayAdaptere<ListContent> i pokazuje BRAK BŁĘDÓW.

Dla odniesienia tutaj jest kod xml układ urywek dla R.id.ListView1

<ListView 
     android:layout_margin="10dp" 
     android:dividerHeight="10.0sp" 
     android:id="@+id/listView1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
+0

Upewnij się, że masz wsparcie rozciągającą fragment ... po prostu usuń import i zmień go –

Odpowiedz

71

Right click on the project folder > Android tools > Clear Link Markers

"Uruchom Android Lint" sprawia, że ​​niektóre markery i markery spowodować ten błąd.

+6

I musiałem odznaczyć "Podczas zapisywania plików, sprawdź błędy" w Preferencje> Android> Sprawdzanie błędów Lint. – Felix

0

Jak widać w docs setAdapter() metoda na AbsListView jest dostępna tylko z poziomu API 11. Więc nie nieprawdaż” Wiele możesz zrobić, możesz po prostu rzucić ostatecznie swoje AbsListView do ListView lub GridView, a następnie zadzwoń setAdapter().

+0

Użyłem tylko 'ListView' w moim kodzie. Po prostu dostosowałem mój "Adapter". Gdzie jest wtedy błąd? – Enigman

+0

po kodzie, a następnie –

+0

@Ovidu: Wysłałem kod. Czy możesz teraz sprawdzić i powiedzieć mi? Dzięki :) – Enigman

7

Rozwiązanie jest po prostu metodą rzutowania, aby poprawić podtyp, ponieważ późniejsze wersje systemu Android wprowadziły wywołanie metody o tej samej nazwie.

@SuppressWarnings({ "unchecked", "rawtypes" }) 

EventListAdapter adapter = new EventListAdapter(activity, R.layout.eventlist_row, item); 
lv = (ListView) getView().findViewById(R.id.listView1); 
((AdapterView)lv).setAdapter(adapter); //ERROR SOLVED HERE 
+0

Nie widzę awarii, wyjaśnij, twój komentarz nie jest przydatny inaczej ... Przesyłasz do Pre API 11 AdapterView, więc to, co tutaj robisz, nie ma nic z nowszym API, po prostu mówisz kompilatorowi, żeby używał poprawnie metoda, która istnieje w pre API 11 ... – Renetik

+1

Przepraszam, przetestowałem twoje rozwiązanie i miałem "błąd metody abstrakcyjnej nie zaimplementowany". Jednak znalazłem obejście mojego problemu. z perspektywy czasu rozwiązanie mogło działać, to moja implementacja nie była dobrze wykonana. Usuwam moją odpowiedź później, ponieważ nie była ona odpowiednia –

0

I rozwiązać „abstrakcyjny sposób nie realizowany błąd” oddając moją metodę setAdapter tak:

@SuppressWarnings("unchecked") 
public void setAdapterSDK8(Adapter adapter) { 
    ((AdapterView) this).setAdapter(adapter); 
    ((StaggeredGridView) this).setAdapter((ListAdapter) adapter); 
} 

Jest to związane z Etsy zachwiał GridView

Powiązane problemy