在适配器数据更改时更新列表视图,在 visual-studio android sdk
Updating the list view when the adapter data changes, in visual-studio android sdk
我的带有适配器的列表视图和 visual studio xamarine android sdk(本机 UI)中的项目集合不会在项目更改时更新。
我正在使用以下代码在 visual-studio-xamarine 中获得项目列表。它似乎有效,除了当项目被更改、添加或删除到集合中时列表不会更新。
我应该采用不同的方法吗?需要做什么才能使列表视图侦听项目更改?
我的自定义适配器
public class TableItemAdapter : BaseAdapter<Table>
{
List<Table> items;
Activity context;
public TableItemAdapter(Activity context, IEnumerable<Table> items) : base() {
this.context = context;
this.items = items.ToList();
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView; // re-use an existing view, if one is available
if (view == null) // otherwise create a new one
view = context.LayoutInflater.Inflate(Resource.Layout.TableListItem, null);
var tableName = view.FindViewById<TextView>(Resource.Id.tvTableName);
tableName.Text = items[position].TABLE_NAME;
tableName.SetTextColor(items[position].tableColor);
view.FindViewById<TextView>(Resource.Id.tvTableDetail).Text = items[position].Rest;
return view;
}
public override long GetItemId(int position) { return position; }
public override Table this[int position] { get { return items[position]; } }
public override int Count { get { return items.Count; } }
}
TableListItem.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout01"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp" >
<TextView
android:id="@+id/tvTableName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:textSize="20sp" />
<TextView
android:id="@+id/tvTableDetail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tvTableName"
android:gravity="right"/>
</RelativeLayout>
c#
private ObservableCollection<Table> tables = new ObservableCollection<Table>();
fillTablesWithObjects(tables); // adding items to collection
listView = FindViewById<ListView>(Resource.Id.lvTables);
var lvAdapter = new TableItemAdapter(this, tables);
listView.Adapter = lvAdapter;
// when adding or altering tables, nothing happens to listview
tables.Add(new Table() { Name = "Table A1" });
NotifyDataSetChanged
、listView.listSource
等好像不是xamarine android sdk,正是我需要的
问题是 tables
实例(在 c# 部分)是被更新的实例 但是 TableItemAdapter
保持 独立 List
在内部,应该更新的就是这个。
那么NotifyDataSetChanged()
就可以了!所以...
我的自定义适配器
public class TableItemAdapter : BaseAdapter<Table>
{
List<Table> items;
...
public void Update(IEnumerable<Table> tables)
{
items.Clear();
items.AddRange(aItems);
NotifyDataSetChanged();
}
}
c#
...
tables.Add(new Table() { Name = "Table A1" });
lvAdapter.Update(tables); // <-- call this everytime tables change
可以优化代码,以便只使用 一个 对象列表,方法是在自定义适配器中添加一个方法到 return 它的 List<Table> items
并使用它而不是为 tables
.
创建另一个 List
我的带有适配器的列表视图和 visual studio xamarine android sdk(本机 UI)中的项目集合不会在项目更改时更新。 我正在使用以下代码在 visual-studio-xamarine 中获得项目列表。它似乎有效,除了当项目被更改、添加或删除到集合中时列表不会更新。
我应该采用不同的方法吗?需要做什么才能使列表视图侦听项目更改?
我的自定义适配器
public class TableItemAdapter : BaseAdapter<Table>
{
List<Table> items;
Activity context;
public TableItemAdapter(Activity context, IEnumerable<Table> items) : base() {
this.context = context;
this.items = items.ToList();
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView; // re-use an existing view, if one is available
if (view == null) // otherwise create a new one
view = context.LayoutInflater.Inflate(Resource.Layout.TableListItem, null);
var tableName = view.FindViewById<TextView>(Resource.Id.tvTableName);
tableName.Text = items[position].TABLE_NAME;
tableName.SetTextColor(items[position].tableColor);
view.FindViewById<TextView>(Resource.Id.tvTableDetail).Text = items[position].Rest;
return view;
}
public override long GetItemId(int position) { return position; }
public override Table this[int position] { get { return items[position]; } }
public override int Count { get { return items.Count; } }
}
TableListItem.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout01"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp" >
<TextView
android:id="@+id/tvTableName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:textSize="20sp" />
<TextView
android:id="@+id/tvTableDetail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tvTableName"
android:gravity="right"/>
</RelativeLayout>
c#
private ObservableCollection<Table> tables = new ObservableCollection<Table>();
fillTablesWithObjects(tables); // adding items to collection
listView = FindViewById<ListView>(Resource.Id.lvTables);
var lvAdapter = new TableItemAdapter(this, tables);
listView.Adapter = lvAdapter;
// when adding or altering tables, nothing happens to listview
tables.Add(new Table() { Name = "Table A1" });
NotifyDataSetChanged
、listView.listSource
等好像不是xamarine android sdk,正是我需要的
问题是 tables
实例(在 c# 部分)是被更新的实例 但是 TableItemAdapter
保持 独立 List
在内部,应该更新的就是这个。
那么NotifyDataSetChanged()
就可以了!所以...
我的自定义适配器
public class TableItemAdapter : BaseAdapter<Table>
{
List<Table> items;
...
public void Update(IEnumerable<Table> tables)
{
items.Clear();
items.AddRange(aItems);
NotifyDataSetChanged();
}
}
c#
...
tables.Add(new Table() { Name = "Table A1" });
lvAdapter.Update(tables); // <-- call this everytime tables change
可以优化代码,以便只使用 一个 对象列表,方法是在自定义适配器中添加一个方法到 return 它的 List<Table> items
并使用它而不是为 tables
.
List