Dynamisch Artikel zur Listenansicht mit benutzerdefinierten Adapter für Android App hinzufügen

? user1282637 @ | Original: StackOverFlow
---

So, jetzt habe ich eine eigene Adapter Klasse, die in einer Reihe von Locations findet und fügt sie zu einem Listview . Das ist alles schön und gut, aber ich würde gerne Orte zu dieser Listview nach dieser Initialisierung hinzuzufügen. Zum Beispiel kann jemand " Erstellen Sie einen Standort ", und es wird sie zu dieser Listview hinzuzufügen. Hier ist meine Haupttätigkeit:

package com.example.listviewtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;

public class MainActivity extends Activity {

private ListView listView1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Location location_data[] = new Location[]
    {
        new Location(R.drawable.ic_launcher, "Location 1", "Fruit!", "2 miles", "8-4 mon-fri
closed sun"),
        new Location(R.drawable.ic_launcher, "Location 2", "Veggies!", "2 miles", "8-5"),
        new Location(R.drawable.ic_launcher, "Location 3", "Plants!", "2 miles", "8-5"),
        new Location(R.drawable.ic_launcher, "Location 4", "Flowers!", "2 miles", "8-5"),
        new Location(R.drawable.ic_launcher, "Location 5", "Baked Goods!", "2 miles", "8-5")
    };

   LocationAdapter adapter = new LocationAdapter(this, 
            R.layout.listview_item_row, location_data);

   //adapter.add(new Location(R.drawable.ic_launcher, "Location 6", "Veggies!", "2 miles", "8-5"));


    listView1 = (ListView)findViewById(R.id.listView1);

    View header = (View)getLayoutInflater().inflate(R.layout.listview_header_row, null);
    listView1.addHeaderView(header);

    listView1.setAdapter(adapter);
}
}

Das funktioniert . Ich möchte jetzt etwas wie adapter.add(new Location(R.drawable.ic_launcher, "Location 6", "Veggies!", "2 miles", "8-5")); tun, nachdem mit dem Array zu füllen.

Hier ist meine LocationAdapter Klasse:

package com.example.listviewtest;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class LocationAdapter extends ArrayAdapter<Location>{

Context context; 
int layoutResourceId;    
Location data[] = null;

public LocationAdapter(Context context, int layoutResourceId, Location[] 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;
    LocationHolder holder = null;

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

        holder = new LocationHolder();
        holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
        holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
        holder.details = (TextView)row.findViewById(R.id.details);
        holder.distance = (TextView)row.findViewById(R.id.distance);
        holder.hours = (TextView)row.findViewById(R.id.hours);

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

    Location location = data[position];
    holder.txtTitle.setText(location.title);
    holder.imgIcon.setImageResource(location.icon);
    holder.details.setText(location.details);
    holder.distance.setText(location.distance);
    holder.hours.setText(location.hours);

    return row;
}

static class LocationHolder
{
    ImageView imgIcon;
    TextView txtTitle;
    TextView details;
    TextView distance;
    TextView hours;
}
}

Alle Ideen, wie ich dies zu implementieren? Danke Shon.

---

Top 5 Antwort

1bstar55 @

In Ihrer Haupttätigkeit, würde ich empfehlen, eine Arraylist < Location> anstatt Ort [], um es einfacher, neue Location Elemente hinzuzufügen. Dann anstatt LocationAdapter Arrayadapter & lt erstrecken ; Location>, haben sie zu verlängern ListAdapter < Location>, damit Sie Ihre Arraylist & lt passieren ; Location> zu.

Das heißt, alles, was Sie in Ihrem addLocation (Ort l) Methode in Ihrer MainActivity tun müssen, ist, fügen Sie ein Element, um entweder den Ort [] oder Arraylist < Location> Datenstruktur Sie Ihre Adapter übergeben, und rufen Sie dann :

adapter.notifyDataSetChanged();

Beachten Sie, dass Sie benötigen, um Ihren Adapter eine Member-Variable in Ihrer MainActivity machen werde, um den Zugriff außerhalb Ihres onCreate lassen ().

2LordRaydenMK @ In your adapter change the Locations data[] from array to ArrayList and override the appropriate constructor In your activity, make your variable data a field (type ArrayList When you add a location you can use data.add(location) Then you can call notifyDatasetChanged() on your adapter

Beispiel-Code: http://androidadapternotifiydatasetchanged.blogspot.in/

3Engineero @

Speichern Sie Ihre Daten in einem ArrayList<Location> statt nur Location[], und dann eine öffentliche Klasse in der Liste Adapter :

ArrayList<Location> data = new ArrayList<Location>();

@Override
public void add(Location location) {
    data.add(location);
    notifyDataSetChanged();
}

Dann, wenn Sie einen Artikel zu der Liste hinzufügen möchten, rufen Sie einfach location_data.add(new_location) .

Edit: Es sieht aus wie Sie Ihre Wahl aus mehreren weitgehend identisch Antworten.

4sotrh @

Sieht aus wie Sie benötigen, um das Add -Methode in Ihrem LocationAdapter Klasse überschreiben, um das Objekt in die interne Liste hinzufügen

@Override
public void add(Location location)
{
    super.add(location);
    data.add(location);
}

Diese Implementierung erfordert, dass Sie Daten in einer Arraylist statt nur einem Array ändern, sonst müssten Sie Code das Array Neudimensionierung selbst.

ArrayList<Location> data = null; // Alternatively use new ArrayList<Location>();

Wenn Sie dies nicht tun, werden die internen Daten bleiben unverändert und ein Aufruf hinzufügen, werden Sie die Liste nicht ändern. Das ist schlecht, weil Sie die Datenvariable verwenden, um die Werte für die Ansichten zu erhalten .