Динамически добавлять элементы в списке просмотра с помощью пользовательского адаптер для Android App

? user1282637 @ | Original: StackOverFlow
---

Таким образом, сейчас у меня есть пользовательский класс адаптера, который принимает массив местах и ​​добавляет их в ListView. Это все хорошо, и денди, но я хотел бы добавить местоположения в этом окне списка после этой инициализации . Например, кто-то может " добавить местоположение", и это добавит его к этому ListView. Вот мой Основная деятельность :

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

Это работает . Я хочу, чтобы сейчас что-то вроде adapter.add(new Location(R.drawable.ic_launcher, "Location 6", "Veggies!", "2 miles", "8-5")); после заполнения его с массивом .

Вот мой класс LocationAdapter :

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

Любые идеи о том, как я могу это реализовать ? Спасибо.

---

Top 5 ответ

1bstar55 @

В вашей основной деятельности, я рекомендую с помощью ArrayList < Location>, а не Местоположение [ ], чтобы сделать его проще добавлять новые элементы Местоположение. Тогда, вместо того, LocationAdapter расширить ArrayAdapter < Location>, пусть он распространяется ListAdapter < Location>, так что вы можете передать ArrayList < Location> к нему.

Тем не менее, все, что вам нужно сделать в вашей addLocation (Место л ) метод в MainActivity, это добавить элемент либо Местоположение [ ] или ArrayList и LT ; Location> Структура данных, который вы передали адаптера, а затем по телефону:

adapter.notifyDataSetChanged();

Обратите внимание, что вам нужно, чтобы сделать ваш адаптер переменную-член в MainActivity, чтобы разрешить доступ за пределами вашей OnCreate ().

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

Пример кода: http://androidadapternotifiydatasetchanged.blogspot.in/

3Engineero @

Храните ваши данные вArrayList<Location> вместо того, чтобы просто Location[], а затем сделать открытый класс в список вашего адаптера :

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

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

Затем, когда вы хотите добавить элемент в список, просто позвоните location_data.add(new_location) .

Изменить: Похоже, у вас есть выбор из нескольких в основном идентичных ответов.

4sotrh @

Похоже, вы должны переопределить метод добавления в своем классе LocationAdapter добавить объект на внутреннем списке

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

Эта реализация требует, чтобы вы изменили данные в ArrayList вместо просто массив, в противном случае вам придется кодироватьмассив изменение размера самостоятельно.

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

Если вы не сделаете этого, внутренние данные останутся без изменений ивызовов, чтобы добавить будет не изменить список . Это плохо, потому что вы используете переменную данных, чтобы получить значения для взглядов.