0

我的Listview与Adapter和Visual Studio中的项目集合xamarine android sdk(本机UI)在项目更改时不会更新。 我使用下面的代码来获得visual-studio-xamarine中的项目列表。它似乎工作,除了当一个项目被更改,添加或删除到集合时不更新列表。在适配器数据更改时更新列表视图visual-studio android sdk

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

我的自定义适配器

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,这正是我所需要的。

回答

0

的问题是,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 

的代码可以优化,使只使用一个对象列表,加入在自定义适配器中返回其List<Table> items并使用该方法而不是为012创建另一个List的方法。

相关问题