2016-04-05 6 views
0

Ich hatte diesen Fehler, wo es sagen würde, es kann Konstruktor Array Adapter nicht auflösen. Ich wollte darüber nachdenken, wollte aber sicherstellen, dass es notwendig war. Ich habe auch die toString-Methode in der item-Klasse überschrieben.Ist es erforderlich, eine benutzerdefinierte Array-Adapterklasse für Objekte in einer ArrayList zu erstellen?

public class Myfragment extends Fragment { 

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

    MyApplication MyArraylist; 


    ArrayAdapter <MyItem> arrayAdapter; 

    MyItem item1 = new MyItem(); 
    item1.setName("MyFirstHomework"); 
    item1.setGrade(60); 
    item1.setCategory("Homework"); 

    MyArraylist = new MyApplication(); 
    MyArraylist.getItemsArrayList().add(item1); 





    arrayAdapter = new ArrayAdapter<MyItem> 
    (this,R.layout.Myview,MyArraylist); //THIS IS WHERE THE CONSTRUCTOR  
    ERROR IS 


    ListView v = (ListView) findViewById(R.id.MyXML); 
    v.setAdapter(arrayAdapter); 




    return inflater.inflate(R.layout.list_fragment,container, false); 
} 
} 

Auch auf ListView findViewById sagt es kann Methode nicht auflösen. Ich habe jetzt stundenlang versucht. Irgendwelche Vorschläge?

public class MyApplication extends Application { 
    ArrayList<MyItem> MyArrayList; 


    public ArrayList<MyItem> getMyArrayList() { 

      MyArrayList = new ArrayList<MyItem>(); 
      return MyArrayList; 
    } 



    } 
+0

'MyArraylist' ist Objekt von' MyApplication', 'MyApplication' ist ArrayList von Item? –

+0

Sie müssen uns MyApplication zeigen. –

+1

Müssten Sie nicht so etwas tun wie 'MyApplication MyArraylist = new MyApplication ()' um den richtigen Typ an den 'ArrayAdapter'-Konstruktor zu übergeben? (Das setzt voraus, dass 'MyApplication' eine' ArrayList' ist). – br3nt

Antwort

1

Ein paar Dinge passieren hier, die Ihren Fortschritt blockieren werden.

Jedes Mal, wenn Sie getItemsArrayList() anrufen, um ein neues Element hinzuzufügen, wird ein neues ArrayList erstellt, das die vorherigen Elemente löscht, die Sie hinzugefügt haben. Dies kann behoben werden, indem die ArrayList im Konstruktor MyApplication und nicht in der Methode erstellt wird.

Außerdem übergeben Sie das Objekt MyApplication anstelle des Objekts ArrayList<MyItem> an den Konstruktor ArrayAdapter. Dies kann gelöst werden, indem eine neue Variable myList hinzugefügt wird, die auf die ArrayList in MyApplication verweist.

Hier ist ein Code mit Kommentaren zu zeigen, was ich meine:

public class Myfragment extends Fragment { 

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

    MyApplication app; // renamed from MyArraylist 
    ArrayAdapter <MyItem> arrayAdapter; 
    ArrayList<MyItem> myList; // this is a new variable to reference the list 

    // create application and get the items list 
    app = new MyApplication(); 
    myList = app.getItemsArrayList(); 

    // create items and add to list 
    MyItem item1 = new MyItem(); 
    item1.setName("Title"); 
    item1.setGrade(60); 
    item1.setCategory("Type"); 
    myList.add(item1); 

    // use myList instead of app (renamed from MyArraylist) in the constructor 
    arrayAdapter = new ArrayAdapter<MyItem>(this, R.layout.Myview, myList); 

    ListView v = (ListView) findViewById(R.id.MyXML); 
    v.setAdapter(arrayAdapter); 

    return inflater.inflate(R.layout.list_fragment,container, false); 
    } 
} 

Und:

public class MyApplication extends Application { 
    private ArrayList<MyItem> myArrayList; 

    public MyApplication() { 
    // create the list in the constructor 
    myArrayList = new ArrayList<MyItem>(); 
    } 

    public ArrayList<MyItem> getMyArrayList() { 
    // return the already initialized list rather than creating a new one 
    return myArrayList; 
    } 
} 

Schließlich wird findViewById() Methode funktioniert nur, wenn Ihre Fragment Klasse Subklassen Activity oder eine andere Klasse, die hat eine findViewById() Methode.

+0

Vielen Dank, dass Sie das erledigt haben. Du hast meine beiden Fragen beantwortet. Ich frage mich, ob ich sowas gemacht habe ListView v = (ListView) getActivity(). FindViewById (R.id.MyXML); Würde das funktionieren? Ich habe es versucht, aber diese App stürzt ab. Ich erhalte diesen Fehler Versuch, virtuelle Methode 'void android.widget.ListView.setAdapter (android.widget.ListAdapter)' auf einem Nullobjektverweis zu rufen – Carlitos

+0

Blick auf ein Beispiel in der [Fragment docs] (http: // Entwickler Deutsch:. Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Es scheint, dass Sie wahrscheinlich vorschlagen würden, dass es der richtige Weg ist. Deutsch:. Wenn Sie immer noch Probleme haben, sollten Sie es am besten als neue Frage zu SO veröffentlichen. – br3nt

1

Ihr vorhandener Code versucht, ein MyApplication-Objekt an den ListAdapter-Konstruktor zu übergeben. Dies wird nicht kompiliert, da MyArraylist vom Typ MyApplication ist:

MyArraylist = new MyApplication(); 
MyArraylist.getItemsArrayList().add(item1); 
arrayAdapter = new ArrayAdapter<MyItem>(this,R.layout.Myview,MyArraylist); 

Stattdessen bedeuten haben Sie von innen MyApplication wie dies an den Konstruktor das tatsächliche Arraylist-Objekt zu übergeben?

MyApplication myapp = new MyApplication(); 
ArrayList<MyItem> list = myapp.getItemsArrayList(); 
list.add(item1); 
arrayAdapter = new ArrayAdapter<MyItem>(this, R.layout.Myview, list); 
+0

Danke.Deine Antwort ist auch gut, aber br3nt hat beide Fragen beantwortet, also akzeptiere ich seine Antwort. – Carlitos