适配器数据更改时更新列表视图,在visual-studio android sdk中

时间:2017-06-16 14:38:10

标签: visual-studio listview xamarin.android android-arrayadapter

我的Listview with Adapter和visual studio xamarine android sdk(原生UI)中的项目集合在项目更改时不会更新。 我正在使用以下代码来获取visual-studio-xamarine中的项目列表。它似乎有效,除了在项目被更改,添加或删除到集合时不更新列表。

我应该采用不同的方法吗?需要做什么才能让listview监听项目更改?

我的自定义适配器

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

NotifyDataSetChangedlistView.listSource等似乎不是xamarine android sdk,这就是我需要的。

1 个答案:

答案 0 :(得分:0)

问题是tables实例(在c#部分中)是更新 TableItemAdapter保持单独 {{1在内部,那是应该更新的那个。

然后List会起作用!所以......

我的自定义适配器

NotifyDataSetChanged()

<强> c#中

public class TableItemAdapter : BaseAdapter<Table>
{
    List<Table> items;
    ...
    public void Update(IEnumerable<Table> tables)
    {
        items.Clear();
        items.AddRange(aItems);
        NotifyDataSetChanged();
    }
}

可以优化代码,以便只使用一个对象列表,方法是在自定义适配器中添加一个方法以返回其... tables.Add(new Table() { Name = "Table A1" }); lvAdapter.Update(tables); // <-- call this everytime tables change 并使用该方法而不是创建另一个{ {1}} List<Table> items