そのため、現在、Locationsの配列を取得して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\nclosed 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;
}
}
_
これを実装する方法についてのアイデアはありますか?ありがとう。
Locations data[]
_を配列から_ArrayList<Location>
_に変更し、適切なコンストラクターをオーバーライドしますdata
をフィールドにします(タイプ_ArrayList<Location>
_)data.add(location)
を使用できますnotifyDatasetChanged()
を呼び出すことができますコード例 。
データを_ArrayList<Location>
_だけでなく_Location[]
_に保存し、リストアダプターでパブリッククラスを作成します。
_ArrayList<Location> data = new ArrayList<Location>();
@Override
public void add(Location location) {
data.add(location);
notifyDataSetChanged();
}
_
次に、リストにアイテムを追加する場合は、location_data.add(new_location)
を呼び出すだけです。
編集:いくつかのほとんど同一の回答から選択したようです。
LocationAdapterクラスのaddメソッドをオーバーライドして、オブジェクトを内部リストに追加する必要があるようです
@Override
public void add(Location location)
{
super.add(location);
data.add(location);
}
この実装では、データを配列ではなくArrayListに変更する必要があります。変更しないと、配列のサイズを自分で変更する必要があります。
ArrayList<Location> data = null; // Alternatively use new ArrayList<Location>();
これを行わないと、内部データは変更されないままになり、addを呼び出してもリストは変更されません。データ変数を使用してビューの値を取得するため、これは悪いことです。
主なアクティビティでは、Location []ではなくArrayList <Location>を使用して、新しいLocation要素を簡単に追加できるようにすることをお勧めします。次に、LocationAdapterでArrayAdapter <Location>を拡張するのではなく、ListAdapter <Location>を拡張して、ArrayList <Location>を渡すことができるようにします。
つまり、MainActivityのaddLocation(Location l)メソッドで行う必要があるのは、アダプターに渡したLocation []またはArrayList <Location>データ構造のいずれかに要素を追加し、次に呼び出すだけです:
adapter.notifyDataSetChanged();
OnCreate()の外部からアクセスできるようにするには、MainActivityでアダプターをメンバー変数にする必要があることに注意してください。